Eas*_*sun 5 python multithreading python-3.x
我的真正任务是使用多线程的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)
Run Code Online (Sandbox Code Playgroud)
但是,上面的代码运行没有尽头.
我的代码出了什么问题?以及如何解决它(更好地使用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
Run Code Online (Sandbox Code Playgroud)
您的代码内部存在死锁。
当您使用时ThreadPoolExecutor(4),该执行器中只有四个工作线程,因此您不能同时运行四个以上的任务。
想象一下以下最简单的结构:
test
----script.py
----test1
--------test2
------------test3
----------------test4
--------------------test5
Run Code Online (Sandbox Code Playgroud)
如果python script.py,第一个工作线程处理test1,第二个工作线程处理test1/test2,第三个工作线程处理test1/test2/test3,第四个工作线程处理test1/test2/test3/test4。现在工作线程已经耗尽。但test1/test2/test3/test4/test5工作队列中插入了另一个任务。
所以它将永远挂起。
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |