您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

python的多处理中的共享变量

python的多处理中的共享变量

使用时,Value您会ctypes在共享内存中获得一个对象,认情况下,该对象使用进行同步RLock。使用ManagerSynManager对象时,您将得到一个控制服务器进程的对象,该服务器进程允许对象值被其他进程操纵。您可以使用同一管理器创建多个代理;无需在循环中创建新的经理:

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)

顺便说一下,如果可能的话,应该避免跨进程/线程共享数据。上面的代码可能会按预期运行,但是会增加执行时间,foo而且事情会变得很奇怪。将以上内容与:

def foo(data, name=''):
    print type(data), data.value, name
    for j in range(1000):
        data.value += 1

您需要aLock才能使其正常工作。

我对所有这些都不是特别了解,所以也许其他人会出现并提供更多见解。我想我会提供一个答案,因为这个问题没有引起注意。希望能有所帮助。

python 2022/1/1 18:37:17 有241人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶