Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 10, 2018 16:07:46

adray0001
Зарегистрирован: 2017-07-31
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Multiprocessing в Python

Здравствуйте. У меня стоит такая задача. Есть 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()

Офлайн

#2 Янв. 10, 2018 23:42:59

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Multiprocessing в Python

Вы что то делаете кардинально не так. Вот вам документация multiprocessing, вы нигде не найдете там упоминания о модуле subprocess, потому что так как показываете Вы - это не работает. Ваша функция должна содержать не вызов дочернего процесса, а сам код, который за Вас выполнит питон в отдельном процессе.
Тема мультипроцессовости не такая простая и требует внимательности и изучения доков.
С другой стороны - описанный алгоритм работы напоминает шаблон -производитель-потребитель. Поэтому можно пересмотреть саму концепцию построения вашего приложения. Так как в “дочерних процессах” у вас вероятнее всего преобладает IO, то я бы предложил для начала один из самых простых приемов - это очередь на потоках. Модуль queue для этого подходит, у меня в блоге есть статья с примерами. Другой вариант это разделить процесс который будет принимать данные и рисовать и процессы которые являются поставщиками данных; в качестве прослойки данных можно использовать очередь типа rabbitmq либо БД.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version