如何解决另一个线程试图将其关闭后,process.stdout.read上的线程被阻塞
我有两个线程,一个要打扰另一个。
线程1:
self.running = True
p = subprocess.Popen (... stdout = subprocess.PIPE)
self.closer = p.stdout
print ("Starting to read.")
while True:
line = p.stdout.read ()
if not line:
print ("Finishing")
break
self.running = False
线程2
print ("About to close.")
self.closer.close ()
while self.running:
time.sleep (0.1)
print ("Finished")
这不起作用。输出是
Starting to read.
About to close.
看起来p.stdout.read()
仍被阻止。
稍后,p.stdout.read()
引发异常
ValueError: PyMemoryView_FromBuffer(): info->buf must not be NULL
此外,我认为线程2的close()
会阻塞,直到出现此异常为止。
中断以阻塞方式从进程读取的线程的正确方法是什么?
解决方法
unix
系统的解决方案:
您需要允许Thread 1
检查关闭标志的状态,而不必无限期地等待读取,例如,在循环中使用poll
对象,如下所示:
import select
import subprocess
process = subprocess.Popen("ls -lah",shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
poll_obj = select.poll()
poll_obj.register(process.stdout,select.POLLIN) # ready for reading
closed = False
while not closed:
if poll_obj.poll(1):
line = process.stdout.readline()
print(line)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。