怎样才能使我的扭曲'反应堆'停止?

问题描述 投票:0回答:1

希望你能弄明白为什么我的反应堆不会停止?在我的线程构造函数中,我尝试了reactor.startRunning(False)和reactor.run()。在这个线程的run命令中,我定期使用reactor.iterate()然后尝试了reactor.stop()和reactor.callFromThread(reactor.stop),但反应堆没有停止,甚至一次。对此的任何反馈都会很棒:)

或者,我可以用什么替换它与使用twisted.internet服务器和资源来设置/监听端口兼容?或者也许可以取代reactor和twisted.internet的东西?

    class DatePage(resource.Resource):
        def __init__(self, date_string):
            resource.Resource.__init__(self)
            self.date_str = str(date_string)

        def render_GET(self, request):
            request.responseHeaders.addRawHeader(b"content-type", b"application/json")
            return get_json().encode('utf-8')

    class PageFactory(resource.Resource):
      def getChild(self, date_string, request):
          return DatePage(date_string)

    class ControlThread(threading.Thread):
        def __init__(self, control_queue, stop_event):
            threading.Thread.__init__(self)
            self.control_queue = control_queue
            self.stop_event = stop_event
            self.site = server.Site(PageFactory())
            self.port = reactor.listenTCP(host_port, self.site)
            reactor.startRunning(False)

        def run(self):
            while not self.stop_event.is_set():
                try:
                    self.process_command(self.control_queue.get_nowait())
                    reactor.iterate()
                except queue.Empty:
                    pass
                time.sleep(0.001)
                reactor.iterate()
            sys.stderr.write("reactor.stop()\n")
            self.port.stopListening()
            reactor.callFromThread(reactor.stop)
            # reactor_thread.join()
            while reactor.running:
                print("running")
                time.sleep(0.1)
            if not reactor.running:
                print("STOPPED!!")

编辑:添加了示例。问题出在ControlThread中,其他类用于后台。

python python-3.x twisted httpserver twisted.web
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.