用callInThread扭曲的Python

用callInThread扭曲的Python,python,twisted,Python,Twisted,我剥离了我的应用程序,但这应该给你一个我正在做的例子 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

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

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()
我有一个应用程序,我想连接并运行一个应用程序,不断地向stdout吐出数据。现在我的应用程序可以正常工作,但问题是当客户端退出套接字连接时,/usr/bin/app仍然继续运行。套接字连接越多,此应用程序仍在运行的次数就越多


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

我可以提出一些建议,希望它能解决您的问题

不要使用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() 

同意deferToThread针对短期运行任务进行了优化。事实上,最好重新编写代码,以便调用线程来运行进程并返回结果。

不要使用线程和Popen。使用。另外,您的
Echo
协议或无法保证它会收到
“getmore”
字符串。

您是否可以检查是否满足条件:如果o==''和p.poll()!=无:中断