我删除了我的应用程序,但这应该给你一个我正在做的例子
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()函数的方法?
最佳答案
我能提出的建议很少,希望能解决你的问题。
不要使用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是针对短时间运行的任务而优化的事实上,最好重新编写代码,这样就可以调用线程来运行进程并返回结果。