Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.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_Queue_Multiprocessing - Fatal编程技术网

python中的多处理

python中的多处理,python,queue,multiprocessing,Python,Queue,Multiprocessing,我在我的项目中使用多重处理。我有一个worker函数,它将结果放入一个队列中。一切正常。但随着x的大小增加(在我的例子中,x是一个数组),出现了一些问题。以下是我的代码的简化版本: def do_work(queue, x): result = heavy_computation_function(x) queue.put(result) # PROBLEM HERE def parallel_something(): queue = Queue() pro

我在我的项目中使用多重处理。我有一个worker函数,它将结果放入一个队列中。一切正常。但随着x的大小增加(在我的例子中,x是一个数组),出现了一些问题。以下是我的代码的简化版本:

def do_work(queue, x):
    result = heavy_computation_function(x)
    queue.put(result)   # PROBLEM HERE

def parallel_something():
    queue = Queue()
    procs = [Process(target=do_work, args=i) for i in xrange(20)]
    for p in procs: p.start()
    for p in procs: p.join()

    results = []
    while not queue.empty():
        results.append(queue.get)

    return results
我在系统中看到监视python进程工作,但随后发生了一些事情,所有进程都在运行,但什么也没做。这是我在键入ctrl-D时得到的结果

    pid, sts = os.waitpid(self.pid, flag)
KeyboardInterrupt

我做一些测试。问题似乎在于将结果放入队列中,事实上,如果我不将结果放入队列中,一切都会正常工作,但没有任何意义。

好吧,看起来这是python队列模块中的一些错误。事实上,使用

from multiprocessing import Manager

queue = Manager().Queue()

…一切正常,但我仍然不知道原因:)

您很可能正在产生死锁

从:

这意味着,无论何时使用队列,都需要确保在加入流程之前,已放入队列的所有项目最终都将被删除。否则,您无法确保将项目放入队列的进程将终止。还要记住,非守护进程将自动加入


本页还提出了一个可能的修复方案。请记住,如果进程没有连接,这并不意味着它们在任何意义上“占用”资源。这意味着您可以在进程完成操作(可能使用)后将排队的数据取出,然后再加入进程。

您似乎永远不会将队列对象传递给新进程。另外,
Process
args
应该是一个
tuple
。尝试将其更改为
args=(队列,i)
。您的
queue.get
还需要一些括号,以便它成为
queue.get()
。区别在于您正在实例化
Manager().queue()
,而不是简单的
queue()
。我认为这意味着
Manager.\uuuu init\uuuu()
会在第一种形式中被调用,但不会在第二种形式中被调用。