Python Twisted Connect永远不会触发

时间:2017-10-05 06:29:43

标签: python python-2.7 network-programming twisted

我有一个用Python编写的控制台类型应用程序,用于触发远程连接,实际连接永远不会被触发。

以下是该应用程序的简化版本:

import sys
import time
from twisted.internet import reactor, threads, protocol
from twisted.internet.endpoints import TCP4ClientEndpoint
from twisted.protocols.basic import LineReceiver

host = 'localhost'
port = 8080

class InterfaceFactory(protocol.Factory):
    def buildProtocol(self, addr):
        return protocol()

def ConnectToMaster():
    deferItem = endpoint.connect(factory)
    deferItem.addErrback(ConnectFailed)
    print('Connecting to master')

def MainProcessLoop():
    done = False

    while True:
        if done == False:
            print 'Triggered connect'
            reactor.callLater(0.1, ConnectToMaster)
            done = True
        time.sleep(1)

def ConnectFailed(self, reason):
    print('Failed to connect... : reason of {0}'.format(reason))

endpoint = TCP4ClientEndpoint(reactor, host, port)
protocol = LineReceiver()
factory = InterfaceFactory()

reactor.callFromThread(MainProcessLoop)
reactor.run()

输出结果为:

$  python testCode.py 
Triggered connect

我真的很困惑,因为这应该是Twisted 101 ... MainProcessLoop在一个线程中,但是它是一个由Twisted管理的线程,加上reactor.run()不是任何形式的线程。 / p>

MainProcessLoop在循环中是否可以阻塞?实际上在那里有一个get_input(),但是为了代码片段而将其删除了。

1 个答案:

答案 0 :(得分:0)

  

MainProcessLoop位于一个帖子

就您的示例而言,MainProcessLoop不在任何线程中。 reactor.callFromThread不生成任何线程,它假定您从一个线程执行,并且您希望在反应器线程中运行某些东西。

  

MainProcessLoop是否在循环中并且可以阻止?

是的,这很重要,因为MainProcessLoop实际上并不在线程中。这也是你没有连接任何东西的原因。功能块和Twisted反应器永远不会有机会运行任务。

希望能回答这些问题。现在为解决方案,它应该只是2个小的变化。首先将reactor.callFromThread(MainProcessLoop)更改为reactor.callInThread(MainProcessLoop),这将生成一个线程并运行该函数。

接下来将reactor.callLater(0.1, ConnectToMaster)更改为

reactor.callFromThread(reactor.callLater, 0.1, ConnectToMaster)

至于你的例子中的while循环,我仍然不确定你要做什么,但无论你是什么,你应该考虑使用Twisted的事件循环,即使while循环是在一个线程。