我的真正任务是使用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
Executor.submit
而不是Executor.map
来避免死锁。 - Eastsunsubmit
并不能解决这个问题。但我认为你只能在顶层目录使用executor
,以便所有任务都是独立的。这不是一个完美的解决方案,但它是最简单的一个,并且我认为对于大多数情况来说也足够好了。 - Sraw