#python #multithreading #python-3.x
#python #многопоточность #python-3.x
Вопрос:
Я пытаюсь создать программу на Python 3, которая имеет один или несколько дочерних процессов.
Родительский процесс порождает дочерние процессы, а затем продолжает заниматься своими делами, время от времени я хочу отправить сообщение определенному дочернему процессу, который его перехватит и предпримет действие.
Также дочерний процесс должен быть не заблокирован во время ожидания сообщения, он будет запускать собственный цикл, поддерживающий соединение с сервером, и отправлять любые полученные сообщения родительскому.
В настоящее время я изучаю модули многопроцессорности, многопоточности, подпроцесса в python, но не смог найти никакого решения.
Чего я пытаюсь достичь, так это иметь основную часть программы, которая взаимодействует с пользователем, заботясь о пользовательских вводах и представляя информацию пользователю. Это будет асинхронно с дочерними частями, которые взаимодействуют с разными серверами, получая сообщения с сервера и отправляя правильные сообщения от пользователя к серверу. Затем дочерние процессы отправят информацию обратно в основную часть, где они будут представлены пользователю
Мои вопросы:
- Я неправильно подхожу к этому
- Какой модуль лучше всего использовать
2.1 Как бы я это настроил
Комментарии:
1. Почему бы вам не реализовать что-нибудь на основе хорошо известных механизмов IPC? Связь через общую память или сокеты (TCP / IP или доменные сокеты Unix) подробно документирована.
Ответ №1:
Смотрите Дуга Хеллманна (многопроцессорный) «Связь между процессами». Часть его модуля Python из серии Week. Довольно просто использовать словарь или список для связи с процессом.
import time
from multiprocessing import Process, Manager
def test_f(test_d):
""" frist process to run
exit this process when dictionary's 'QUIT' == True
"""
test_d['2'] = 2 ## change to test this
while not test_d["QUIT"]:
print "test_f", test_d["QUIT"]
test_d["ctr"] = 1
time.sleep(1.0)
def test_f2(name):
""" second process to run. Runs until the for loop exits
"""
for j in range(0, 10):
print name, j
time.sleep(0.5)
print "second process finished"
if __name__ == '__main__':
##--- create a dictionary via Manager
manager = Manager()
test_d = manager.dict()
test_d["ctr"] = 0
test_d["QUIT"] = False
##--- start first process and send dictionary
p = Process(target=test_f, args=(test_d,))
p.start()
##--- start second process
p2 = Process(target=test_f2, args=('P2',))
p2.start()
##--- sleep 3 seconds and then change dictionary
## to exit first process
time.sleep(3.0)
print "n terminate first process"
test_d["QUIT"] = True
print "test_d changed"
print "data from first process", test_d
time.sleep(5.0)
p.terminate()
p2.terminate()
Комментарии:
1. Спасибо всем за информацию, текущие рабочие проблемы заставили меня отложить этот хобби-проект на пару дней, но я посмотрю на все, что сказано, и посмотрю, поможет ли это мне
2. голосую за ссылку «Связь между процессами» Дуга Хеллманна (многопроцессорная) !
Ответ №2:
Похоже, вы знакомы с мультиобработкой, просто не знакомы с python.
os.pipe предоставит вам каналы для соединения родительского и дочернего процессов. И семафоры могут использоваться для координации / передачи сигналов между родительским и дочерним процессами. Возможно, вы захотите рассмотреть очереди для передачи сообщений.