gpt4 book ai didi

python - 如何使用ThreadPoolExecutor递归遍历目录?

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

我的真正任务是使用多线程的 paramiko 递归遍历远程目录。为了简单起见,我只是使用本地文件系统来演示它:

from pathlib import Path
from typing import List
from concurrent.futures import ThreadPoolExecutor, Executor

def listdir(root: Path, executor: Executor) -> List[Path]:
if root.is_dir():
xss = executor.map(lambda d: listdir(d, executor), root.glob('*'))
return sum(xss, [])
return [root]

with ThreadPoolExecutor(4) as e:
listdir(Path('.'), e)

但是,上面的代码一直跑不完。

我的代码有什么问题?以及如何修复它(最好使用 Executor 而不是原始的 Thread)?

编辑:我已经通过以下代码确认了@Sraw 的回答:

In [4]: def listdir(root: Path, executor: Executor) -> List[Path]:
...: print(f'Enter {root}', flush=True)
...: if root.is_dir():
...: xss = executor.map(lambda d: listdir(d, executor), root.glob('*'))
...: return sum(xss, [])
...: return [root]
...:

In [5]: with ThreadPoolExecutor(4) as e:
...: listdir(Path('.'), e)
...:
Enter .
Enter NonRestrictedShares
Enter corporateActionData
Enter RiskModelAnnualEPS
Enter juyuan

最佳答案

您的代码中存在死锁。

由于您正在使用 ThreadPoolExecutor(4),因此该执行器中只有四个工作线程,因此您不能同时运行四个以上的任务。

想象以下最简单的结构:

test
----script.py
----test1
--------test2
------------test3
----------------test4
--------------------test5

如果python script.py,第一个工作线程处理test1,第二个处理test1/test2,第三个处理test1/test2/test3,第四个处理test1/test2/test3/test4。现在工作线程已经用完了。但是还有另一个任务 test1/test2/test3/test4/test5 插入到工作队列中。

所以它会永远挂起。

关于python - 如何使用ThreadPoolExecutor递归遍历目录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50402630/

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