0 / 0 / 0
Регистрация: 02.05.2015
Сообщений: 3
1

Передача сообщений между процессами и потоками

02.05.2015, 21:53. Показов 9285. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, помогите, пожалуйста, с задачей по Операционным системам: Создать процесс с двумя дочерними процессами, процесс с двумя потоками и организовать передачу сообщений между всеми этими процессами.

В питоне я новичок, есть пару набросков, но я не уверен в их правильности.
Здесь я передаю сообщения через обычный pipe, но сложность в том, что сообщения помещаются в очередь и трудно контролировать, какое сообщение куда попадет
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import multiprocessing
import time
import threading
 
(pout,pin)=multiprocessing.Pipe()
#suprocess 1
def fun1(pin, pout):
    print(pout.recv())  
    pin.send('Child Process 1 send message to Child Process 2')
    print(pout.recv())   
    
#subprocess 2
def fun2(pin, pout):
    print(pout.recv())
    pin.send('Child Process 2 send message to Child Process 1')
    print(pout.recv())
 
#main process 2
def fun3(pin, pout):
    t1=threading.Thread(target=fun4, args=(pin, pout))
    t2=threading.Thread(target=fun4, args=(pin, pout))
    t1.start()
    t2.start()
 
#Threads    
def fun4(pin,pout):
    pin.send('Thread send message')
   
#main process 1 
if __name__ =='__main__':
    p1=multiprocessing.Process(target=fun1, args=(pin, pout ))
    p2=multiprocessing.Process(target=fun2, args=(pin, pout ))
    p1.start()
    p2.start()
    pin.send('Parent Process 1 send message to Child Process 1')
    pin.send('Parent Process 1 send message to Child Process 2')
 
    p3=multiprocessing.Process(target=fun3, args=(pin, pout))
    p3.start()
 
    print(pout.recv())
    
    p1.join()
    p2.join()
    p3.join()
    time.sleep(10)
Еще пробовал через сокеты, но приложение ругается на то, что нельзя передавать строки, числа, а только байты.
encode() , decode() не помогают.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import multiprocessing
import time
import threading
import socket
 
#suprocess 1
def fun1():
    print('Child Process 1 started')
    sock=socket.socket()
    sock.connect(('localhost',64440))
    sdata=('Child Process 1 send message to Main Process')
    sdata.encode()
    sock.send(sdata)
    sock.close()
#subprocess 2
def fun2():
    print('Child Process 2 started')
 
#main process 2
def fun3():
    print('Process 2 started')
    t1=threading.Thread(target=fun4)
    t2=threading.Thread(target=fun4)
    t1.start()
    t2.start()
 
#Threads    
def fun4():
    print('Thread started')
   
#main process 1 
if __name__ =='__main__':
    print('Process 1 started')
    p1=multiprocessing.Process(target=fun1)
    p2=multiprocessing.Process(target=fun2)
    p1.start()
    p2.start()
 
    p3=multiprocessing.Process(target=fun3)
    p3.start()
 
    #server
    sock=socket.socket()
    sock.bind(('',64440))
    sock.listen(5)
    conn, addr=sock.accept()
    while True:
        data=conn.recv(1024)
        if not data:
            break
        data.decode()
        print(data)
    conn.close()
  
    p1.join()
    p2.join()
    p3.join()
    time.sleep(10)
0
02.05.2015, 21:53
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.05.2015, 21:53
Ответы с готовыми решениями:

Передача сообщений между процессами
Python 3.4. GUI - WxPython Имеется локальный сервер на Flask. На сервере крутится страничка, которая каждую секунду опрашивает БД....

Передача сложных объектов между процессами
Имеется такая задача: Нужно создавать и заполнять некую иерархию классов, в разных процессах(для ускорения) и возвращать в главный...

Передача данных между потоками/процессами
Ребят, у вас тут поактивнее раздел. В соседней ветке .NET я не нашел решения, может java-программисты знают как лучше сделать. Суть...

3
Модератор
Эксперт JS
 Аватар для Eva Rosalene
5240 / 2113 / 416
Регистрация: 06.01.2013
Сообщений: 4,844
02.05.2015, 22:04 2
lsn, вызов encode не меняет переменную.
Делайте так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import multiprocessing
import time
import threading
import socket
 
#suprocess 1
def fun1():
    print('Child Process 1 started')
    sock=socket.socket()
    sock.connect(('localhost',64440))
    sdata='Child Process 1 send message to Main Process'
    sock.send(sdata.encode("utf-8"))
    sock.close()
#subprocess 2
def fun2():
    print('Child Process 2 started')
 
#main process 2
def fun3():
    print('Process 2 started')
    t1=threading.Thread(target=fun4)
    t2=threading.Thread(target=fun4)
    t1.start()
    t2.start()
 
#Threads    
def fun4():
    print('Thread started')
   
#main process 1 
if __name__ =='__main__':
    print('Process 1 started')
    p1=multiprocessing.Process(target=fun1)
    p2=multiprocessing.Process(target=fun2)
    p1.start()
    p2.start()
 
    p3=multiprocessing.Process(target=fun3)
    p3.start()
 
    #server
    sock=socket.socket()
    sock.bind(('',64440))
    sock.listen(5)
    conn, addr=sock.accept()
    while True:
        data=conn.recv(1024)
        if not data:
            break
        print(data.decode("utf-8"))
    conn.close()
  
    p1.join()
    p2.join()
    p3.join()
    time.sleep(10)
1
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
03.05.2015, 09:09 3
Цитата Сообщение от lsn Посмотреть сообщение
организовать передачу сообщений между всеми этими процессами
Нужна конкретика: какого характера передача сообщений. Точка-точка, коллективные обмены.

Цитата Сообщение от lsn Посмотреть сообщение
сложность в том, что сообщения помещаются в очередь и трудно контролировать, какое сообщение куда попадет
Значит, на каждый процесс нужен отдельный канал. Реализация не важна: будь это пайп, сокет или любая очередь прикладного уровня.
1
0 / 0 / 0
Регистрация: 02.05.2015
Сообщений: 3
03.05.2015, 13:19  [ТС] 4
Если действовать через сокеты, то на каждый процесс нужен и сервер и клиент?
0
03.05.2015, 13:19
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2015, 13:19
Помогаю со студенческими работами здесь

Передача текстовых сообщений между процессами
Реализовать сеть однотипных процессов, которые способны только с помощью событий передавать текстовые сообщения друг другу. Желательно с...

Передача сообщений между процессами и завершение процессов
Нужно сделать передачу сообщений между 15 процессами поочередно(то есть 1 - 2, 7-8 и т.п.), а потом нужно что бы каждый 4 процесс...

Передача сообщений между потоками
Привет! Есть у меня простой класс-логгер: static class Logger { public delegate void Message(string msg); ...

Windows API и передача сообщений между процессами посредством SEND_MESSAGE
Здравствуйте, уважаемые форумчане! Прошу помочь с передачей сообщений между процессами с помощью функции SEND_MESSAGE.В примерах в...

Управление процессами, передача данных между процессами
Постановка задачи 1. Осуществить обмен текстовыми и графическими данными между двумя приложениямиP1 и P2 с выводом информации в заданную...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Использование кэша Laravel - полный гайд
bytestream 18.02.2025
Кэширование - один из наиболее эффективных способов повышения производительности веб-приложений. В современном мире, где скорость загрузки страниц напрямую влияет на удержание пользователей и. . .
Создаем REST API в Laravel с аутентификацией и Passport
bytestream 18.02.2025
Разработка современных веб-приложений все чаще требует создания надежного и хорошо структурированного API. REST API стал стандартом де-факто для построения взаимодействия между клиентской и серверной. . .
Пайплайны в Laravel - полный гайд
bytestream 18.02.2025
Разработка современных веб-приложений часто требует обработки сложных процессов, состоящих из множества последовательных шагов. Например, при создании системы комментариев может потребоваться. . .
Как правильно использовать @required в Symfony
bytestream 18.02.2025
При разработке приложений на Symfony мы часто сталкиваемся с необходимостью внедрения зависимостей. Фреймворк предоставляет несколько способов управления этим процессом, и одним из таких инструментов. . .
Система безопасности в Laravel: возможности и примеры
Wired 18.02.2025
Каждый день появляются новые виды атак и уязвимостей, которые могут поставить под угрозу конфиденциальные данные пользователей и функционирование всей системы. В этом контексте выбор надежного. . .
Давайте сравним Django и Laravel
Wired 18.02.2025
Django и Laravel - два мощных инструмента, которые часто сравнивают между собой. Оба фреймворка предлагают разработчикам богатый набор возможностей для создания масштабируемых веб-приложений, но. . .
Laravel или React - что лучше?
Wired 18.02.2025
В разработке веб выбор правильного инструмента часто определяет успех всего проекта. Особенно интересным представляется сравнение Laravel и React - двух популярных технологий, которые часто. . .
Laravel 11: новые возможности, гайд по обновлению
Wired 18.02.2025
Laravel 11 - это новая масштабная версия одного из самых популярных PHP-фреймворков, выпущенная в марте 2024 года. Эта версия продолжает традицию внедрения передовых технологий и методологий. . .
Миграции в Laravel
Wired 18.02.2025
Разработка веб-приложений на Laravel неразрывно связана с управлением структурой базы данных. При работе над проектом часто возникает необходимость вносить изменения в схему базы данных - добавлять. . .
Аутентификация в Laravel
Wired 18.02.2025
В современном мире веб-разработки безопасность пользовательских данных становится критически важным аспектом любого приложения. Laravel, как один из самых популярных PHP-фреймворков, предоставляет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru