当尝试使用 pool.map() 来定位具有多个参数(包括 Lock() 对象)的函数时,它是对于解决子进程之间共享锁的问题至关重要。由于 pickling 限制,传统的 multiprocessing.Lock() 无法直接传递给 Pool 方法。
一种方法是利用 Manager()并实例化一个 Manager.Lock()。虽然此方法很可靠,但由于托管 Manager 服务器的额外进程,它会涉及更多开销。此外,锁定操作需要通过 IPC 与此服务器通信。
或者,您可以在池初始化期间传递常规 multiprocessing.Lock() 使用初始化关键字参数。这确保了锁实例在所有子进程中都是全局的。此方法消除了部分函数的必要性并简化了流程。
这是使用选项 2 的示例:
def target(iterable_item):
for item in items:
# Do cool stuff
if (... some condition here ...):
lock.acquire()
# Write to stdout or logfile, etc.
lock.release()
def init(l):
global lock
lock = l
def main():
iterable = [1, 2, 3, 4, 5]
l = multiprocessing.Lock()
pool = multiprocessing.Pool(initializer=init, initargs=(l,))
pool.map(target, iterable)
pool.close()
pool.join()
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3