我有一个可执行文件,我使用subprocess.Popen调用.然后,我打算通过stdin使用一个线程从stdin中提取一些数据,该线程从队列中读取其值,稍后将在另一个线程中填充.应该使用另一个线程中的stdout管道读取输出,并再次在队列中进行排序.
据我之前的研究所理解,使用带队列的线程是一种很好的做法.
遗憾的是,外部可执行文件不会快速给出每个管道输入的答案,因此简单的写入,读取线周期不是一个选项.可执行文件实现了一些内部多线程,我希望输出一旦可用,就要附加读者线程.
作为测试可执行文件的示例,只需对每行进行随机播放(shuffleline.py):
#!/usr/bin/python -u
import sys
from random import shuffle
for line in sys.stdin:
line = line.strip()
# shuffle line
line = list(line)
shuffle(line)
line = "".join(line)
sys.stdout.write("%s\n"%(line))
sys.stdout.flush() # avoid buffers
Run Code Online (Sandbox Code Playgroud)
请注意,这已经尽可能没有缓冲.或者不是吗?这是我的精简测试程序:
#!/usr/bin/python -u
import sys
import Queue
import threading
import subprocess
class WriteThread(threading.Thread):
def __init__(self, p_in, source_queue):
threading.Thread.__init__(self)
self.pipe = p_in
self.source_queue = source_queue
def run(self):
while True:
source = self.source_queue.get()
print "writing to process: ", repr(source)
self.pipe.write(source)
self.pipe.flush()
self.source_queue.task_done()
class ReadThread(threading.Thread):
def __init__(self, p_out, target_queue): …Run Code Online (Sandbox Code Playgroud)