【发布时间】:2021-09-17 07:25:27
【问题描述】:
我制作了一个脚本,它通过 ThreadPool 中的os.system() 调用一些程序并将工作结果打印到控制台。简化后的代码是这样的:
import os
from concurrent.futures import ThreadPoolExecutor, as_completed
import multiprocessing
from threading import Lock
print_mutex = Lock()
def print_safe(text):
with print_mutex:
print(text, flush=True)
def print_smth():
res = os.system("")
print_safe("1")
with ThreadPoolExecutor(max_workers = multiprocessing.cpu_count()) as thread_pool:
future_results = [thread_pool.submit(print_smth) for i in range(40)]
for future in future_results:
future.result()
但是在控制台输出中我收到了这样的意外结果:
如果我评论res = os.system("") call,则输出有效。
为什么 os.system() 会以这种方式影响打印功能?
实施流程调用以避免此类问题的正确方法是什么?
【问题讨论】:
-
你是真实的(非简化的)子进程打印的东西吗?
-
我无法使用
os.system("")重现此内容。 -
我确实可以在 Windows 上重现
-
@o11c 没关系。我在简化示例中尝试了这两个选项并得到了相同的行为。我在 cmd 中在 Windows 10 上的 python 3.8.2 上运行了示例
-
即使在
os.system("")的情况下,该问题也是可重现的,因此没有输出。
标签: python python-3.x windows threadpool os.system