首页 > 解决方案 > 运行与 twisted.internet.reactor 并行的 couroutine

问题描述

我正在尝试运行与使用twisted.internet.reactorpython 3.6.8 构建的无限侦听器并行的协程。我无法在反应器中找到合适的 API 以超时运行。我遇到了一些黑客攻击,比如 -

reactor.callLater(OTHER_COUROUTINE_POLL_INTERVAL, reactor.stop)
reactor.run()

这确实会停止侦听器协程,但是当我尝试重新实例化并重新启动反应器时,它会抱怨-

...    
raise error.ReactorNotRestartable()
twisted.internet.error.ReactorNotRestartable

我不知道如何克服这一点。早些时候我曾尝试使用asyncio.wait_for()超时。但是超时无法停止侦听器。

我在 python 3.9 中尝试了另一种称为to_thread()的方法。但是我不确定我是否已经很好地理解了这种方法。我可以让主线程在一个单独的线程中与无限运行的侦听器一起运行。

这是我一直在探索的完整示例代码 -

import asyncio
import time
from twisted.web import server, resource, http
from twisted.internet import reactor

OTHER_COUROUTINE_POLL_INTERVAL=2.0
class Listener(resource.Resource):
    isLeaf = False

    def __init__(self):
        pass

    def start(self):
        root = self
        site = server.Site(root)
        reactor.listenTCP(1940, site, interface="localhost")
        reactor.callLater(OTHER_COUROUTINE_POLL_INTERVAL, reactor.stop)
        reactor.run()

def poll():
    print('\n\nCheck for changes..')

async def my_listener():
    print("\n\nAbout to run infinite loop..")
    l = Listener()
    l.start()

while True:
    loop = asyncio.get_event_loop()
    loop.run_until_complete(my_listener())
    poll()
    time.sleep(2)

标签: pythonpython-asynciocoroutine

解决方案


推荐阅读