繁体   English   中英

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

[英]How to recursive traversal directory using ThreadPoolExecutor?

我的真正任务是使用多线程的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插入到工作队列中。

所以它将永远挂起。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM