subprocess.Popen 在 WSL Linux 上花费太长时间

Roa*_*ner 4 python subprocess windows-subsystem-for-linux

我有这个subprocess.Popen()上下文管理器:

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)
Run Code Online (Sandbox Code Playgroud)

list(process.stdout)在 WSL Linux 环境中运行时,处理时间似乎需要 53 秒。然而,当我在Windows环境中运行它时,只需要0.6秒。我觉得很奇怪为什么时间安排如此不同。

我尝试使用subprocess.run()andsubprocess.check_output()代替,但它们在处理循环之前仍然会导致相同的长时间滞后tqdm()

我在这里错过了什么吗?我尝试查看文档以了解 Windows 与 WSL Linux 环境中使用的差异subprocess.Popen(),但我仍然不确定问题是什么。也许list(process.stdout)这里是不必要的,并且有更好的方法来存储来自标准输出的行。

任何形式的指导都会非常有帮助。

Von*_*onC 5

您需要在 2019 年第三季度使用 WSL2 重新评估该性能问题。

\n\n

请参阅Craig Loewen的“宣布 WSL 2

\n\n
\n

这个新架构中的变化将实现:文件系统性能的显着提高以及完整的系统调用兼容性,这意味着您可以在 WSL 2 中运行更多 Linux 应用程序,例如 Docker。

\n\n

git clone诸如、npm installapt update、等文件密集型操作apt upgrade都会明显更快。
\n 实际速度提升将取决于您运行的应用程序\xe2\x80\x99 以及它与文件系统的交互方式。
\n 我们\xe2\x80\x99 运行的初始测试显示,在解压压缩的 tarball 时,WSL 2 的运行速度比 WSL 1 快 20 倍,在使用 和以及git clone在各种项目中运行时速度快约 2-5 倍。npm installcmake

\n\n

Linux 二进制文件使用系统调用来执行许多功能,例如访问文件、请求内存、创建进程等。
\n 在 WSL 1 中,我们创建了一个翻译层,用于解释许多此类系统调用并允许它们在 Windows NT 内核上工作。然而,\xe2\x80\x99 实现所有这些系统调用具有挑战性,导致某些应用程序无法在 WSL 1 中运行。
\n 现在 WSL 2 包含自己的 Linux 内核,它具有完整的系统调用兼容性

\n
\n