我对线程是新手,所以我觉得我好像遗漏了一个明显的问题,但是我找不到与这个主题相关的前一个问题。在
我想做一个写stdin并读取c程序的stdout的程序。这是主程序中的代码。在
from subprocess import Popen, PIPE
from threading import Thread
from Queue import Queue, Empty
from os import getcwd
import time
import random
chatter = Queue(maxsize=10) # Queue of strings to be sent to the program
class Chatter():
def stream_talker(self, identifier, stream):
while True:
if not chatter.empty():
self.proc.stdin.write(chatter.get(True, 1))
def stream_watcher(self, identifier, stream):
while True:
for line in stream:
print line
def main(self):
self.proc = Popen(getcwd() + '/main', stdout=PIPE, stdin=PIPE)
Thread(target=self.stream_talker, name='stdin-talker', args=('STDIN', self.proc.stdin)).start()
Thread(target=self.stream_watcher, name='stdout-listening', args=('STDOUT', self.proc.stdout)).start()
while True:
chat = raw_input('Enter chatter: ')
if len(chat) > 0:
chatter.put(chat)
if __name__ == '__main__':
chatt = Chatter()
chatt.main()
这是它调用的main.c程序。在
^{pr2}$当前的问题是,虽然它将运行,但stdout永远不会被打印出来。在
看起来您的主要问题是调用了两个
stream_talker()
,而不是stream_watcher()
。在此外,您可能不想在队列上忙着等待(因为这违背了使用队列的全部意义)。您的代码以最快的速度轮询
chatter.empty()
,直到队列中有内容为止。直接使用chatter.get()
;它将阻塞,直到有可用的东西或者直到它到达超时。在最后,如果您在
stream_talker()
中编写stream
参数,而不是硬编码,那么您可能会避免一些将来的困惑自我程序标准. 在相关问题 更多 >
编程相关推荐