相关疑难解决方法(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万
查看次数

如何在Python的多处理池中使用值

我希望能够使用多处理库中的“值”模块来跟踪数据。据我所知,在Python中进行多处理时,每个进程都有其自己的副本,因此我无法编辑全局变量。我希望能够使用值来解决此问题。有谁知道我如何将Values数据传递到池函数中?

from multiprocessing import Pool, Value
import itertools

arr = [2,6,8,7,4,2,5,6,2,4,7,8,5,2,7,4,2,5,6,2,4,7,8,5,2,9,3,2,0,1,5,7,2,8,9,3,2,]

def hello(g, data):
    data.value += 1

if __name__ == '__main__':
    data = Value('i', 0)
    func = partial(hello, data)
    p = Pool(processes=1)
    p.map(hello,itertools.izip(arr,itertools.repeat(data)))

    print data.value
Run Code Online (Sandbox Code Playgroud)

这是我遇到的运行时错误:

RuntimeError: Synchronized objects should only be shared between processes through inheritance
Run Code Online (Sandbox Code Playgroud)

有人知道我在做什么错吗?

python python-multiprocessing

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

与 multiprocessing.Pool 共享一个计数器

我想使用multiprocessing.Value+multiprocessing.Lock在不同的进程之间共享一个计数器。例如:

import itertools as it
import multiprocessing

def func(x, val, lock):
    for i in range(x):
        i ** 2
    with lock:
        val.value += 1
        print('counter incremented to:', val.value)

if __name__ == '__main__':
    v = multiprocessing.Value('i', 0)
    lock = multiprocessing.Lock()

    with multiprocessing.Pool() as pool:
        pool.starmap(func, ((i, v, lock) for i in range(25)))
    print(counter.value())
Run Code Online (Sandbox Code Playgroud)

这将引发以下异常:

RuntimeError:同步对象只能通过继承在进程之间共享

我最困惑的是,一个相关的(虽然不是完全类似的)模式适用于multiprocessing.Process()

if __name__ == '__main__':
    v = multiprocessing.Value('i', 0)
    lock = multiprocessing.Lock()

    procs = [multiprocessing.Process(target=func, args=(i, v, lock))
             for i in …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing multiprocessing python-3.x python-multiprocessing

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