Как я могу остановить мой Twisted «реактор»? - PullRequest
0 голосов
/ 02 апреля 2019

в надежде выяснить, почему мой реактор не остановится? В своем конструкторе потоков я пробовал реактор.startRunning (False) и реактор.run (). В команде запуска для этого потока я периодически используюrator. Любой отзыв об этом будет потрясающим :)

В качестве альтернативы, что еще можно заменить на это, совместимое с использованием сервера и ресурса 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, другие классы для фона.

1 Ответ

0 голосов
/ 02 апреля 2019

Похоже, что вы пытаетесь запустить Twisted реактор в неосновном потоке, а затем отправлять ему сообщения (стоп-сообщение и, похоже, также некоторые другие сообщения).

Twistedуже есть поточно-безопасный API для передачи сообщений - и вы даже используете его: reactor.callFromThread.Вы должны просто использовать это для связи с реактором.Это избавляет от необходимости вызывать неинтерфейсные методы startRunning и iterate и использовать запутанный и сложный атрибут 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 в потоке.

...