如何使我的“反应器”扭曲停止?

时间:2019-04-02 09:13:49

标签: python python-3.x twisted httpserver twisted.web

希望您能弄清楚为什么我的反应堆不会停止?在我的线程构造器中,我尝试了react.startRunning(False)和Reactor.run()。在此线程的运行命令中,我定期使用react..rate(),然后尝试了react.stop()和react.callFromThread(reactor.stop),但是Reactor不会停止,甚至不会停止。关于此的任何反馈都将很棒:)

或者,我还能用与twisted.internet服务器和资源设置/监听端口兼容的方式替换它吗?还是可以代替电抗器和twisted.internet的东西?

func_1()

编辑:添加了示例。问题出在ControlThread中,其他类都在背景中。

1 个答案:

答案 0 :(得分:0)

您似乎正在尝试在非主线程中运行Twisted反应器,然后向其发送消息(停止消息,以及其他一些消息)。

Twisted已经具有线程安全的消息传递API-您甚至正在使用它:reactor.callFromThread。您应该只使用它与反应堆通信。这样就无需调用非接口方法startRunningiterate并使用令人困惑和复杂的running属性(在编写的任何基于Twisted的程序中都应避免使用这些属性)

所以:

class ReactorThread(Thread):
    def __init__(self, reactor):
        Thread.__init__(self)
        self.reactor = reactor

    def listen(self):
        self.reactor.callFromThread(self._listen)

    def _listen(self):
        self.site = server.Site(PageFactory())
        self.port = reactor.listenTCP(host_port, self.site)

    def run(self):
        self.reactor.run(installSignalHandlers=False)

# later ...
from twisted.internet import reactor
t = ReactorThread(reactor)
t.start()
# ...
t.reactor.callFromThread(t.reactor.stop)
t.join()

您还可以使用t.reactor.callFromThread发送任何您喜欢的其他消息,其形式为将在反应堆线程中调用的函数。

您可能还想看看https://crochet.readthedocs.io/en/stable/来管理线程中的Twisted。