怎样才能使我的扭曲'反应堆'停止?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了怎样才能使我的扭曲'反应堆'停止?相关的知识,希望对你有一定的参考价值。
希望你能弄明白为什么我的反应堆不会停止?在我的线程构造函数中,我尝试了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()
")
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中,其他类用于后台。
看起来你试图在非主线程中运行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。
以上是关于怎样才能使我的扭曲'反应堆'停止?的主要内容,如果未能解决你的问题,请参考以下文章