我正在考虑实现一个新的事件循环,以便根据现有的运行循环实现(如cocoa的asyncio
和qt的NSRunLoop
)插入到QEventLoop
中。但很难找到一个开始的地方。
文档中说系统是设计为可插拔的,但是没有任何地方能确切地说明如何实现这一点。我应该从AbstractEventLoop
还是BaseEventLoop
开始?什么方法是什么,我需要提供哪些组件?我发现唯一有用的替代实现是uvloop,但很难理解,因为它严重依赖于Cython和libuv,而我对此并不熟悉。
是否有一些关于如何完成事件循环实现以及如何生成自定义循环的描述?或者一个不那么复杂的实现,我可以更快地了解它?谢谢你的指点。
最佳答案
documentation表示从AbstractEventLoop
继承。
对于您的其余问题,我没有发现文档非常清楚,但是asyncio
中的具体事件循环的source code非常有用。我写了一篇
pretty minimal example从AbstractEventLoop
继承以创建事件驱动的模拟器。
我最想听到的是
实施create_task
。最终用户使用asyncio.ensure_future(coro())
调度协程,但这只调用循环的create_task
方法。它不需要超过def create_task(self, coro): return asyncio.Task(coro, loop=self)
实现call_soon
、call_at
和call_later
。最终用户调用这些函数来调度一个简单的回调函数。当最终用户调度协同程序时,异步/等待系统也会自动调用它们。
如果常规回调引发异常,它将转到循环的call_exception_handler
方法。如果协同程序引发异常,则异常存在于某个异步的“永不着陆”中,您必须catch it there。
查找source code for AbstractEventLoop
以查看应重写的所有其他方法。奖励:一些有帮助的评论。