python - 运行与 twisted.internet.reactor 并行的 couroutine
问题描述
我正在尝试运行与使用twisted.internet.reactor
python 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)
解决方案
推荐阅读
- python - Regex: How to get span or group of *pattern* which matches input string
- ios - RxSwift 使 Observable 触发一个主题
- flutter - Flutter/Dart:在 Widget Param 中将 int 转换为 double 不起作用
- python - 迷宫无解时如何处理或检测?
- vue.js - vue js应用程序中的firebase身份验证显示错误
- javascript - 使用 Vue/heroku 的自定义 API 路径 URL
- algorithm - 为什么我的数独求解器没有更改 TypeScript 中传递的数组值?
- android - 如何测试和部署资产超过 150 MB 的 Flutter 应用?
- python - 比较两个字典并返回新字典
- android - Android Studio 和 JavaFx