【问题标题】:Why my python multi process code runs very slow?为什么我的 python 多进程代码运行很慢?
【发布时间】:2012-09-23 15:51:05
【问题描述】:
# multi-processes
from multiprocessing import Process, Queue
class Worker(object):
    def __init__(self, queue):
        self.queue = queue
        self.process_num = 10 <------------ 10 processes
        self.count = 0

    def start(self):
        for i in range(self.process_num):
            p = Process(target = self.run)
            p.start()
            p.join()

    def run(self):
        while True:
            self.count += 1
            user = self.queue.get()
            # do something not so fast like time.sleep(1)
            print self.count
            if self.queue.empty():
                break

我使用 Worker().start(queue) 启动程序,但输出没有我预期的那么快(似乎只有一个进程在运行)。

我的代码有问题吗?

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    是的,您一次只运行一个进程,您正在等待每个进程终止后再开始下一个进程;

    def start(self):
        for i in range(self.process_num):
            p = Process(target = self.run)
            p.start()                       <-- starts a new process
            p.join()                        <-- waits for the process to terminate
    

    换句话说,您正在启动 10 个进程,但在第一个进程终止之前,第二个进程不会启动,依此类推。

    对于您要执行的操作,最好不要手动使用Process,而是使用Process Pool

    【讨论】:

    • 谢谢,有道理,但是如果我想手动使用它,我应该把 join 方法放在哪里?我希望我的主进程等待那些子进程。
    • 棘手的一个。如果可以等待所有进程终止,然后像现在一样循环并将进程添加到数组中。当你全部启动它们时,只需循环数组并加入()它们一个接一个。如果主进程要继续做其他事情,则需要偶尔(主循环)运行数组和 Join(),超时为 0,跟踪哪些进程已终止并将它们从数组中删除。边注;我不知道有什么方法可以在子进程终止时得到通知,但我总是使用进程池,所以可能有一种我不知道的方法。
    猜你喜欢
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多