Форум сайта python.su
0
Здравствуйте. У меня стоит такая задача. Есть 4 независимых процесса которые постоянно получают массив с внешнего устройства. Моя задача отрисовать эти данные в основном процессе так чтоб при отключении одного из процессов главный процесс не зависал. Основной проблемой является обмен данными между главным процессом и дочерними. Я думал использовать общую память но не могу до конца с этим разобраться.
Вот как я запускаю все процессы:
import subprocess import function import multiprocessing def reciev400(): proc1 = subprocess.Popen('python ./usrp400.py', shell=True) proc1.wait() def reciev800(): proc2 = subprocess.Popen('python ./usrp800.py', shell=True) proc2.wait() def reciev1200(): proc3 = subprocess.Popen('python ./usrp1200.py', shell=True) proc3.wait() def reciev2400(): proc4 = subprocess.Popen('python ./usrp2400.py', shell=True) proc4.wait() print("OK") for i in [reciev400,reciev800,reciev1200,reciev2400]: p=multiprocessing.Process(target=i) p.start()
Офлайн
221
Вы что то делаете кардинально не так. Вот вам документация multiprocessing, вы нигде не найдете там упоминания о модуле subprocess, потому что так как показываете Вы - это не работает. Ваша функция должна содержать не вызов дочернего процесса, а сам код, который за Вас выполнит питон в отдельном процессе.
Тема мультипроцессовости не такая простая и требует внимательности и изучения доков.
С другой стороны - описанный алгоритм работы напоминает шаблон -производитель-потребитель. Поэтому можно пересмотреть саму концепцию построения вашего приложения. Так как в “дочерних процессах” у вас вероятнее всего преобладает IO, то я бы предложил для начала один из самых простых приемов - это очередь на потоках. Модуль queue для этого подходит, у меня в блоге есть статья с примерами. Другой вариант это разделить процесс который будет принимать данные и рисовать и процессы которые являются поставщиками данных; в качестве прослойки данных можно использовать очередь типа rabbitmq либо БД.
Офлайн