代码之家  ›  专栏  ›  技术社区  ›  Mike

被卡林特里德扭曲的蟒蛇

  •  3
  • Mike  · 技术社区  · 14 年前

    我删除了我的应用程序,但这应该给你一个我正在做的例子

    def run_app(f):
        p = Popen(['/usr/bin/app'],stdout=PIPE)
        while True:
            o = p.stdout.readline()
            if o == '' and p.poll() != None: break
    
            reactor.callFromThread(f, o)
    
    class Echo(Protocol):
        def connectionMade(self):
    
            reactor.callInThread(run_app, self.appDataReceived)
    
        def dataReceived(self, data):
            data = data.strip()
            if data == "getmore":
                print "getmore"
    
        def appDataReceived(self, u):
            print u
    
    def main():
        factory = Factory()
        factory.protocol = Echo
        reactor.listenTCP(3646, factory)
        reactor.run()
    
    if __name__ == "__main__":
        main()
    

    我有一个应用程序,我想连接并运行一个应用程序,不断吐出数据到标准输出。现在,我的应用程序工作,但问题是当客户端退出套接字连接时,/UR/BI/APP仍然继续运行。套接字连接越多,此应用程序仍在运行。

    Echo Procool中是否还有终止run_app()函数的方法?

    2 回复  |  直到 14 年前
        1
  •  1
  •   pyfunc    14 年前

    我能提出的建议很少,希望能解决你的问题。

    不要使用reactor.callFromThread,而是使用deferToThread

    from twisted.internet.threads import deferToThread
    deferredObj = threads.deferToThread(run_app, self.appDataReceived)
    

    示例代码:

    class Echo(Protocol):
        def connectionLost(self, reason):
            print reason
            # which is crude, there should be a more elegant answer
            reactor.stop() 
    

        2
  •  3
  •   Jean-Paul Calderone    14 年前

    不要使用线程和Popen。使用 Twisted's process support Echo 协议 needs framing "getmore" 弦。