相关疑难解决方法(0)

在多个进程之间共享结果队列

multiprocessing模块的文档显示了如何将队列传递给以multiprocessing.Process.开头的进程.但是,如何与异步工作进程共享队列apply_async?我不需要动态加入或其他任何东西,只是工人(反复)将结果报告回基地的一种方式.

import multiprocessing
def worker(name, que):
    que.put("%d is done" % name)

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=3)
    q = multiprocessing.Queue()
    workers = pool.apply_async(worker, (33, q))
Run Code Online (Sandbox Code Playgroud)

这失败了: RuntimeError: Queue objects should only be shared between processes through inheritance.我理解这意味着什么,我理解继承的建议,而不是要求pickle/unpickling(以及所有特殊的Windows限制).但如何我传递队列中一个可行的办法?我找不到一个例子,我尝试了几种以各种方式失败的替代品.请帮忙?

python queue parallel-processing multiprocessing python-multiprocessing

77
推荐指数
2
解决办法
4万
查看次数

如何将队列引用传递给pool.map_async()管理的函数?

我想要一个长时间运行的进程来返回它在队列(或类似的东西)上的进度,我将把它提供给进度条对话框.完成该过程后,我还需要结果.这里的测试示例失败了RuntimeError: Queue objects should only be shared between processes through inheritance.

import multiprocessing, time

def task(args):
    count = args[0]
    queue = args[1]
    for i in xrange(count):
        queue.put("%d mississippi" % i)
    return "Done"

def main():
    q = multiprocessing.Queue()
    pool = multiprocessing.Pool()
    result = pool.map_async(task, [(x, q) for x in range(10)])
    time.sleep(1)
    while not q.empty():
        print q.get()
    print result.get()

if __name__ == "__main__":
    main()
Run Code Online (Sandbox Code Playgroud)

我已经能够得到这个使用单个进程对象的工作(在这里我 alowed传递一个队列引用),但是我没有一个池来管理许多流程我要启动.有关更好的模式的建议吗?

python queue pool multiprocessing

37
推荐指数
2
解决办法
2万
查看次数

当作为参数传递给 multiprocessing.Process 时,multiprocessing.Queue 实例如何序列化?

相关问题出现在Why I can't use multiprocessing.Queue with ProcessPoolExecutor? 。我提供了部分答案以及解决方法,但承认这个问题引发了另一个问题,即为什么可以multiprocessing.Queue将实例作为参数传递给辅助函数。multiprocessing.Process

例如,以下代码在使用spawnfork方法创建新进程的平台下会失败:

from multiprocessing import Pool, Queue

def worker(q):
    print(q.get())

with Pool(1) as pool:
    q = Queue()
    q.put(7)
    pool.apply(worker, args=(q,))
Run Code Online (Sandbox Code Playgroud)

上述提出:

RuntimeError: Queue objects should only be shared between processes through inheritance

但下面的程序运行没有问题:

from multiprocessing import Process, Queue

def worker(q):
    print(q.get())

q = Queue()
q.put(7)
p = Process(target=worker, args=(q,))
p.start()
p.join()
Run Code Online (Sandbox Code Playgroud)

看来,多处理池工作函数的参数最终会放在池的输入队列上,该队列是作为 a 实现的,multiprocessing.SimpleQueue并且您不能将实例放入使用 a进行序列化的实例中。multiprocessing.Queuemultiprocessing.SimpleQueueForkingPickler

那么,multiprocessing.Queue当作为参数传递给 a …

python queue multiprocessing

6
推荐指数
1
解决办法
1387
查看次数

具有更新队列和输出队列的Python多处理

如何编写使用两个队列的Python多进程脚本?

  1. 一个作为工作队列,从一些数据开始,然后根据要并行化的功能的条件,即时接收其他任务,
  2. 另一个收集结果并用于在处理完成后记下结果。

我基本上需要根据我在初始项目中发现的内容,在工作队列中添加更多任务。我在下面发布的示例很愚蠢(我可以随意更改项目并将其直接放在输出Queue中),但是它的机制很明确,反映了我需要开发的概念的一部分。

在此,我尝试:

import multiprocessing as mp

def worker(working_queue, output_queue):
    item = working_queue.get() #I take an item from the working queue
    if item % 2 == 0:
        output_queue.put(item**2) # If I like it, I do something with it and conserve the result.
    else:
        working_queue.put(item+1) # If there is something missing, I do something with it and leave the result in the working queue 

if __name__ == '__main__':
    static_input = range(100)    
    working_q = mp.Queue()
    output_q = mp.Queue()
    for i …
Run Code Online (Sandbox Code Playgroud)

python multiprocessing

5
推荐指数
2
解决办法
1万
查看次数