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

use*_*602 5 python python-multiprocessing

我希望能够使用多处理库中的“值”模块来跟踪数据。据我所知,在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)

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

Tom*_*ton 6

我不知道为什么,但是如果使用Pool手动创建子流程,您将不会遇到一些问题。例如以下作品:

from multiprocessing import Process, Value

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


def hello(data, g):
    with data.get_lock():
        data.value += 1
    print id(data), g, data.value

if __name__ == '__main__':
    data = Value('i')
    print id(data)

    processes =  []
    for n in arr:
        p = Process(target=hello, args=(data, n))
        processes.append(p)
        p.start()

    for p in processes:
        p.join()

    print "sub process tasks completed"
    print data.value
Run Code Online (Sandbox Code Playgroud)

但是,如果您基本上使用相同的想法Pool,那么您会收到错误“RuntimeError:同步对象只能通过继承在进程之间共享”。我以前在使用池时看到过这个错误,但从未完全了解它的底部。

使用Value似乎可以使用的替代方法Pool是使用 Manager 为您提供“共享”列表:

from multiprocessing import Pool, Manager
from functools import partial


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


def hello(data, g):
    data[0] += 1


if __name__ == '__main__':
    m = Manager()
    data = m.list([0])
    hello_data = partial(hello, data)
    p = Pool(processes=5)
    p.map(hello_data, arr)

    print data[0]
Run Code Online (Sandbox Code Playgroud)