Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的python多进程代码运行得非常慢?_Python_Python 2.7 - Fatal编程技术网

为什么我的python多进程代码运行得非常慢?

为什么我的python多进程代码运行得非常慢?,python,python-2.7,Python,Python 2.7,我使用Worker.startqueue启动程序,但输出速度不如预期,似乎只有一个进程正在运行 我的代码中有问题吗?是的,您一次只运行一个进程,您正在等待每个进程终止,然后再启动下一个进程 # multi-processes from multiprocessing import Process, Queue class Worker(object): def __init__(self, queue): self.queue = queue self.p

我使用Worker.startqueue启动程序,但输出速度不如预期,似乎只有一个进程正在运行


我的代码中有问题吗?

是的,您一次只运行一个进程,您正在等待每个进程终止,然后再启动下一个进程

# 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
换句话说,您将启动10个进程,但第二个进程直到第一个进程终止才会启动,依此类推


对于您试图执行的操作,最好不要手动使用流程,而是使用一个。

是的,您一次只运行一个流程,您正在等待每个流程终止,然后再启动下一个流程

# 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
换句话说,您将启动10个进程,但第二个进程直到第一个进程终止才会启动,依此类推


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

谢谢,这是有道理的,但是如果我想手动使用它,我应该将join方法放在哪里?我希望我的主进程等待那些子进程。棘手的一个。如果可以等待所有进程终止,则按现在的方式循环并将进程添加到数组中。当你完成所有的启动后,只需循环数组并逐个加入它们。如果主进程要继续执行其他操作,则需要偶尔在数组中运行主循环,并在超时为0的情况下加入,跟踪哪些进程已终止并将其从数组中删除。旁注;我不知道有什么方法可以在子进程终止时得到通知,但我总是使用进程池,所以可能有一种方法我不知道。谢谢,这很有意义,但是如果我想手动使用它,我应该将join方法放在哪里?我希望我的主进程等待那些子进程。棘手的一个。如果可以等待所有进程终止,则按现在的方式循环并将进程添加到数组中。当你完成所有的启动后,只需循环数组并逐个加入它们。如果主进程要继续执行其他操作,则需要偶尔在数组中运行主循环,并在超时为0的情况下加入,跟踪哪些进程已终止并将其从数组中删除。旁注;我不知道有什么方法可以在子进程终止时得到通知,但我总是使用进程池,所以可能有一种方法我不知道。