【发布时间】:2018-07-05 11:31:23
【问题描述】:
以下代码在Win7下运行,有线程T1和T2,T1在原窗口打印dir内容,T2在新窗口ping 4秒。
import os
import sys
import logging
import subprocess
import threading
class T1 (threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
proc = subprocess.Popen("dir", shell=True, stdout=subprocess.PIPE)
for line in iter(proc.stdout.readline, ''):
logging.debug(line)
logging.info("HEREEEEEEEE")
class T2 (threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
def run(self):
subprocess.Popen(["ping.exe", "-n", "4", "127.0.0.1"], creationflags=subprocess.CREATE_NEW_CONSOLE)
logging.info("")
if __name__=='__main__':
logger = logging.getLogger('root')
FORMAT = "[TID:%(thread)d %(funcName)s L#%(lineno)s] %(message)s"
logging.basicConfig(format=FORMAT, level=logging.DEBUG)
t1 = T1()
t2 = T2()
t1.start()
t2.start()
t1.join()
t2.join()
sys.exit(0)
对于T1线程中的logging.info("HEREEEEEEEE")这一行,我认为应该是在打印完dir的内容后立即打印出来的。
什么对我没有意义:为什么该行没有立即打印,而是在线程 T2 完成后 4 秒后打印?
不知道是不是和多线程中的文件描述符有关。
【问题讨论】:
-
@eryksun 它正确打印目录内容,无论如何我更新我的代码以避免混淆。
-
@eryksun 是的,我认为 dir 不是关键。
-
@eryksun 谢谢!这个对我有用。老实说,我不太清楚 close_fds 是如何影响 readline() 的,我会带你去学习更多的技巧。
标签: python windows multithreading subprocess