Связь между родительскими дочерними процессами

#python #multithreading #python-3.x

#python #многопоточность #python-3.x

Вопрос:

Я пытаюсь создать программу на Python 3, которая имеет один или несколько дочерних процессов.

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

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

В настоящее время я изучаю модули многопроцессорности, многопоточности, подпроцесса в python, но не смог найти никакого решения.

Чего я пытаюсь достичь, так это иметь основную часть программы, которая взаимодействует с пользователем, заботясь о пользовательских вводах и представляя информацию пользователю. Это будет асинхронно с дочерними частями, которые взаимодействуют с разными серверами, получая сообщения с сервера и отправляя правильные сообщения от пользователя к серверу. Затем дочерние процессы отправят информацию обратно в основную часть, где они будут представлены пользователю

Мои вопросы:

  1. Я неправильно подхожу к этому
  2. Какой модуль лучше всего использовать
    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 предоставит вам каналы для соединения родительского и дочернего процессов. И семафоры могут использоваться для координации / передачи сигналов между родительским и дочерним процессами. Возможно, вы захотите рассмотреть очереди для передачи сообщений.