Python subprocess.Popen在WSL Linux上花费的时间太长
我有一个上下文管理器:Python subprocess.Popen在WSL Linux上花费的时间太长,python,subprocess,windows-subsystem-for-linux,Python,Subprocess,Windows Subsystem For Linux,我有一个上下文管理器: with Popen( args=command, shell=False, stdout=PIPE, bufsize=1, universal_newlines=True ) as process: # TIMING start = timer() lines = list(process.stdout) end = timer() print('Time taken:', end - start) # 53.66207
with Popen(
args=command, shell=False, stdout=PIPE, bufsize=1, universal_newlines=True
) as process:
# TIMING
start = timer()
lines = list(process.stdout)
end = timer()
print('Time taken:', end - start) # 53.662078000000065 seconds -> Linux
for _ in tqdm(iterable=lines, total=len(lines)):
sleep(0.1)
if process.returncode != 0:
raise CalledProcessError(returncode=process.returncode, cmd=process.args)
在WSL Linux环境中运行时,处理list(process.stdout)
似乎需要53秒。但是,当我在Windows环境中运行它时,只需要0.6秒。我觉得奇怪,为什么时间如此不同
我尝试过使用and,但是在处理tqdm()
循环之前,它们仍然会导致相同的长时间延迟
我是不是遗漏了什么?我试着查看文档,看看在Windows和WSL Linux环境中使用subprocess.Popen()
有什么不同,但我仍然不确定问题出在哪里。也许这里不需要list(process.stdout)
,还有一种更好的方法来存储stdout中的行
在这里,任何形式的指导都会非常有用 用于Linux的Windows子系统有点垃圾。它有很多很多bug,而且速度比需要的慢得多。这只是另一个正在显现的bug。以下是一些可能的瓶颈:
- WSL中的缓慢上下文切换
- WSL没有注意到等待管道的整个进程意味着管道的另一端现在应该运行
- 正在延迟执行的子进程
- Windows花了一段时间才发现需要使用
来启动程序(感谢RoadRunner!)wsl.exe
- Windows通常的开销,加上Linux通常(相对较小)的开销
- Ubuntu发行版选择不当,导致许多不必要的服务运行在
(?)systemd
- 由于未知原因,Windows决定在子进程之前运行其他内容
- Windows子系统故意恶意攻击Linux开发人员,通过设置一个strawman来“证明”Windows是优越的操作系统。太傻了
您的Python代码没有任何问题会导致速度变慢。您需要在2019年第三季度使用WSL2重新评估该性能问题 请参阅 这一新体系结构中的更改将允许:显著提高文件系统性能,并实现完全的系统调用兼容性,这意味着您可以在WSL2中运行更多的Linux应用程序,如Docker 文件密集型操作,如
git clone
,npm安装
,apt更新
,apt升级
,以及更多操作都将显著加快。实际速度的提高将取决于您正在运行的应用程序及其与文件系统的交互方式。
我们运行的初始测试表明,与WSL1相比,WSL2在解包压缩tarball时运行速度快20倍,在各种项目上使用
git clone
、npm install
和cmake
时运行速度快2-5倍
Linux二进制文件使用系统调用执行许多功能,如访问文件、请求内存、创建进程等。在WSL1中,我们创建了一个转换层,它解释许多系统调用,并允许它们在Windows NT内核上工作。然而,实现所有这些系统调用是一项挑战,导致一些应用程序无法在WSL 1中运行。
既然WSL2包含了自己的Linux内核,它就具有了完整的系统调用兼容性