Следует ли создавать очередь сообщений в дочернем или родительском процессе? - PullRequest
1 голос
/ 20 ноября 2019

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

import multiprocessing as mp

class testProcess(mp.Process):
    def __init__(self, msgQueue):
        mp.Process.__init__(self, daemon=True)
        self.msgQueue = msgQueue    

if __name__ == "__main__":
    # Instantiate queue in parent process and pass to child:
    msgQueue = mp.Queue()
    t = testProcess(msgQueue)

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

Однако у меня сейчас много дочерних процессов, и становится уродливо порождать кучу очередей вродительский процесс и отслеживать их. Было бы чётче порождать очередь в методе __init__ дочернего процесса и просто обращаться к нему в родительском элементе как к части пространства имен дочернего процесса, например так:

import multiprocessing as mp

class testProcess(mp.Process):
    def __init__(self):
        mp.Process.__init__(self, daemon=True)
        # Instantiate queue from within child __init__:
        self.msgQueue = mp.Queue()


if __name__ == "__main__":
    t = testProcess()
    # Now I can access the queue like so:
    t.msgQueue.put("hi there child")

Я думаю, технически __init__ оператор класса Process в любом случае выполняется в родительском процессе (я так думаю?), Поэтому я не думаю, что это может иметь какое-либо значение.

Итак, мой вопрос, я получу ударс какой-то проблемой позже, если я создаю экземпляры очередей в операторе дочернего процесса __init__? Есть ли преимущество в любом случае? Или они эквивалентны?

...