gpt4 book ai didi

python - 在 Python 多处理模块中使用 Pool with Queue

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:02 25 4
gpt4 key购买 nike

我想使用多处理模块来加速遍历目录结构。首先,我做了一些研究,发现了这个 Stack Overflow 线程:

How do I run os.walk in parallel in Python?

但是,当我尝试在线程中调整代码时,我一直遇到问题。这是我写的一个小脚本,用于测试 Pool 并弄清楚它是如何工作的。:

import os

from multiprocessing.pool import Pool
from multiprocessing import Process
from multiprocessing import JoinableQueue as Queue

def scan():
print "Hi!"
while True:
print "Inside loop"
directory = unsearched.get()
print "Got directory"
unsearched.task_done()
print "{0}".format(directory)

if __name__ == '__main__':

# Put those directories on the queue
unsearched = Queue()
top_dirs = ['a', 'b', 'c']
for d in top_dirs:
unsearched.put(d)
print unsearched

# Scan the directories
processes = 1
pool = Pool(processes)
for i in range(processes):
print "Process {0}".format(i)
pool.apply_async(scan)

# Block until all the tasks are done
unsearched.join()
print 'Done'

发生的事情是脚本进入扫描函数内部的循环并就在那里:

PS C:\Test> python .\multiprocessing_test.py
<multiprocessing.queues.JoinableQueue object at 0x000000000272F630>
Process 0
Hi!
Inside loop

我确定我在这里遗漏了一些简单的东西。

最佳答案

这实际上对我来说在 Linux 上运行良好,但在 Windows 上挂起。这是因为在 Windows 上,if __name__ ... 守卫中的所有内容都不会在子进程中执行,这当然包括定义 unsearched。这意味着 scan 在尝试使用 unsearched 时抛出异常,但该异常永远不会在父级中使用,因此您看不到 Traceback 出现在命令行界面。相反,它只是挂起。

要使其在 Windows 和 Linux 上运行,您可以在创建 Pool 时使用 initializer/initargs 关键字参数来制作 unsearched 在 child 的范围内:

def initializer(q):
global unsearched
unsearched = q

...

然后将旧的 Pool 调用替换为:

pool = Pool(processes, initializer=initializer, initargs=(unsearched,))

关于python - 在 Python 多处理模块中使用 Pool with Queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24705669/

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