更新输出时的python子进程回调

更新输出时的python子进程回调,python,asynchronous,websocket,subprocess,tornado,Python,Asynchronous,Websocket,Subprocess,Tornado,我用的是龙卷风。我希望下面的内容易于理解,它生成了一个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()

我用的是龙卷风。我希望下面的内容易于理解,它生成了一个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.'}))
class traceroutHandler(tornado.websocket.WebSocketHandler):
def打开(自,仪表板):
p=subprocess.Popen(['traceroute',ip],stdout=subprocess.PIPE,stderr=subprocess.PIPE)
p.poll()为无时:#正在运行
line=p.stdout.readline()
如果行=无和len(线)>0:
self.write_消息(json.dumps({'stdout':line}))
self.write_消息(json.dumps({'stdout':'Done!对于红色标记的ip地址,无法使用确定位置。如果您知道正确的位置,请在那里更新它。'))
问题是,由于p.poll()是None循环,所以tornado会阻塞。另外,如果p.stdout中没有要读取的内容,则
p.stdout.readline
会阻塞。因此,我希望有某种回调机制,当我在
p.stdout
中有新内容时,它会被触发。如何做到这一点?

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

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


感谢您在评论中的链接。

线程本身在Python中不是很好,所以我会尝试使用的队列。