gpt4 book ai didi

python多处理锁问题

转载 作者:太空狗 更新时间:2023-10-30 00:37:09 26 4
gpt4 key购买 nike

我想添加一个字典列表和 python 多处理模块。

这是我的代码的简化版本:

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-

import multiprocessing
import functools
import time

def merge(lock, d1, d2):
time.sleep(5) # some time consuming stuffs
with lock:
for key in d2.keys():
if d1.has_key(key):
d1[key] += d2[key]
else:
d1[key] = d2[key]

l = [{ x % 10 : x } for x in range(10000)]
lock = multiprocessing.Lock()
d = multiprocessing.Manager().dict()

partial_merge = functools.partial(merge, d1 = d, lock = lock)

pool_size = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes = pool_size)
pool.map(partial_merge, l)
pool.close()
pool.join()

print d
  1. 运行此脚本时出现此错误。我该如何解决?

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

  2. 在这种情况下是否需要 merge 函数中的 lock?或者 python 会处理它?<​​/p>

  3. 我认为 map 应该做的是将某项从一个列表映射到另一个列表,而不是将一个列表中的所有内容转储到单个对象。那么有没有更优雅的方式来做这样的事情呢?

最佳答案

以下应该在 Python 2 和 3 中跨平台运行(即在 Windows 上)。它使用进程池初始化程序将管理器字典设置为每个子进程中的全局。

仅供引用:

  • 对于经理命令,不需要使用锁。
  • Pool 中的进程数默认为 CPU 计数。
  • 如果您对结果不感兴趣,可以使用 apply_async而不是 map
import multiprocessing
import time

def merge(d2):
time.sleep(1) # some time consuming stuffs
for key in d2.keys():
if key in d1:
d1[key] += d2[key]
else:
d1[key] = d2[key]

def init(d):
global d1
d1 = d

if __name__ == '__main__':

d1 = multiprocessing.Manager().dict()
pool = multiprocessing.Pool(initializer=init, initargs=(d1, ))

l = [{ x % 5 : x } for x in range(10)]

for item in l:
pool.apply_async(merge, (item,))

pool.close()
pool.join()

print(l)
print(d1)

关于python多处理锁问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8276933/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com