3

我正在使用龙卷风。我希望以下内容易于理解,它产生一个 tcproute 进程并将输出发送到 websocket 的另一端。

class TracerouteHandler(tornado.websocket.WebSocketHandler):
  def open(self,ip):
    p = subprocess.Popen(['traceroute',ip],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    while p.poll() is None: #running
      line=p.stdout.readline()
      if line!=None and len(line)>0:
        self.write_message(json.dumps({'stdout':line})) 
    self.write_message(json.dumps({'stdout':'Done! For red marked ip addresses, the location couldn\'t be determined with <a href="http://hostip.info">hostip.info</a>. If you know the correct location, please update it there.'}))

问题是由于while p.poll() is None循环,龙卷风块。此外,如果 p.stdout 中没有可读取的内容,则p.stdout.readline块。所以我想要某种回调机制,当我在p.stdout. 我怎么做?

4

1 回答 1

1

使用QueuePython 附带的非阻塞消息传递机制。

这个答案有一个非常好的实现,其中一个单独的线程从进程中读取输出行,并将它们写入队列。主线程可以以非阻塞方式从队列中读取。

感谢Andrew提供评论中的链接。

于 2012-11-06T07:12:26.503 回答