Python多处理在Main之外的模块中启动进程

时间:2018-04-17 17:31:26

标签: python python-multiprocessing python-multithreading

我有三个模块,workermasterMainTests。我正在运行MainTests模块作为主脚本。在MainTests中,我调用master.run(),其中我需要生成多个worker进程。这可能吗?在我遇到的所有python multiprocessing教程中,进程都在主模块中启动。如果这是可能的,有人可以举例说明这可能是什么样的吗?

这是我到目前为止所尝试的:

Worker.py

import time

class Worker(object):
    def __init__(self):
        super(Worker, self).__init__()
    def run(self):
        time.sleep(5)
        print("worker done with run")
        return

Master.py:

import multiprocessing

class Master(object):
    def __init__(self, workers_array):
        super(Master, self).__init__()
        self.workers_array = workers_array
    def run(self):
        process_arr = [multiprocessing.Process(worker.run()) for worker in self.workers_array]
        [worker_process.start() for worker_process in process_arr]

MainTests.py

from Worker import *
from Master import *

workers_array = [Worker() for i in range(5)]
master = Master(workers_array)
master.run()

出现两个问题:

  1. 工作者似乎是按顺序运行,逐个执行run()而不是并行运行。
  2. 工人似乎不断重复跑步。我希望在工人完成他们的运行后,程序结束,但它会继续。
  3. 提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我不确定您是否仍在锁定答案,但是您只需要在以下if语句中放入 main 程序的“入口点”即可:

if __name__ == "__main__":
    main()

这样,您可以在导入的模块中启动进程。 有关更多信息,请查看this bit of the docs以及其中的其他内容:)

在您的示例中为:

from Worker import *
from Master import *

if __name__ == __main__:
    workers_array = [Worker() for i in range(5)]
    master = Master(workers_array)
    master.run()

这对我有用。 希望我能帮上忙。