第一个问题是Value和Manager()。Value有什么区别?
其次,是否可以不使用Value共享整数变量?下面是我的示例代码。我想要的是获取一个整数值而不是Value的字典。我所做的就是在此过程之后全部更改。有没有更简单的方法?
from multiprocessing import Process, Manager def f(n): n.value += 1 if __name__ == '__main__': d = {} p = [] for i in range(5): d[i] = Manager().Value('i',0) p.append(Process(target=f, args=(d[i],))) p[i].start() for q in p: q.join() for i in d: d[i] = d[i].value print d
使用时,Value您会ctypes在共享内存中获得一个对象,默认情况下,该对象使用进行同步RLock。使用Manager该SynManager对象时,您将得到一个控制服务器进程的对象,该服务器进程允许对象值被其他进程操纵。您可以使用同一管理器创建多个代理;无需在循环中创建新的经理:
Value
ctypes
RLock
Manager
SynManager
manager = Manager() for i in range(5): new_value = manager.Value('i', 0)
在Manager可以跨计算机共享,而Value仅限于一台计算机。 Value会更快(运行下面的代码查看),所以我认为您应该使用它,除非您需要支持任意对象或通过网络访问它们。
import time from multiprocessing import Process, Manager, Value def foo(data, name=''): print type(data), data.value, name data.value += 1 if __name__ == "__main__": manager = Manager() x = manager.Value('i', 0) y = Value('i', 0) for i in range(5): Process(target=foo, args=(x, 'x')).start() Process(target=foo, args=(y, 'y')).start() print 'Before waiting: ' print 'x = {0}'.format(x.value) print 'y = {0}'.format(y.value) time.sleep(5.0) print 'After waiting: ' print 'x = {0}'.format(x.value) print 'y = {0}'.format(y.value)
总结一下:
Array
警告
顺便说一下,如果可能的话,应该避免跨进程/线程共享数据。上面的代码可能会按预期运行,但是会增加执行时间,foo而且事情会变得很奇怪。将以上内容与:
foo
def foo(data, name=''): print type(data), data.value, name for j in range(1000): data.value += 1
您需要aLock才能使其正常工作。
Lock
我对所有这些都不是特别了解,所以也许其他人会出现并提供更多见解。我想我会提供一个答案,因为这个问题没有引起注意。希望能有所帮助。