我想使用multiprocessing pool
来访问,读取和修改python中的变量。进程是完全独立的,但是必须访问相同的变量。使用pointers
中的C
可以很容易地做到这一点,但是如何在python中实现呢?
例如,我已经这样做了:
import multiprocessing as mp
import time
a=3
def one(arg):
time.sleep(2*arg[1])
print(arg)
arg[0]+=1
print(arg[0])
return arg[0]
if __name__ == '__main__':
with mp.Pool(processes=2) as pool:
print(pool.map(one,[[a,1],[a,2]]))
但是它返回
[3, 1]
4
[3, 2]
4
[4, 4]
代替[4,5]
。
答案 0 :(得分:1)
您可以在进程之间共享变量。使用共享内存。
from multiprocessing import Process, Value, Array
def f(n, a):
n.value = 3.1415927
for i in range(len(a)):
a[i] = -a[i]
if __name__ == '__main__':
num = Value('d', 0.0)
arr = Array('i', range(10))
p = Process(target=f, args=(num, arr))
p.start()
p.join()
print(num.value)
print(arr[:])
Value
和Array
是特殊的对象,可让您在它们之间共享状态。 d
和i
是您要共享的变量类型的印刷代码。
但是,此解决方案不提供任何同步机制。您需要注意不要同时读写。
此解决方案也只能用于简单值。如果需要共享对象,则应查看Manager
模块中的multiprocessing
类。
来自文档的努力
由Manager()返回的管理器将支持类型列表,字典,命名空间,锁,RLock,信号量,BoundedSemaphore,条件,事件,屏障,队列,值和数组
因此,如您所见,您还可以共享RLock
来设置用于读写共享变量的同步机制。
此处有更多信息:https://docs.python.org/3.5/library/multiprocessing.html#sharing-state-between-processes