如何学习如何实现自定义Python asyncio事件循环?

ura*_*sjr 10 python

我正在考虑实现一个新的事件循环来插入asyncio基于现有的运行循环实现,如Cocoa NSRunLoop和Qt QEventLoop.但是很难找个地方开始.

文档说该系统设计为可插拔的,但它没有确切说明如何做到这一点.我应该开始AbstractEventLoop,还是BaseEventLoop?什么方法做什么,我需要提供哪些组件?我发现唯一有用的替代实现是uvloop,但发现很难理解,因为它很大程度上依赖于我不熟悉的Cython和libuv.

是否有关于如何完成事件循环实现的文章,以及如何制作自定义循环?或者参与程度较低,我可以更快地解决问题?谢谢你的任何指示.

Dam*_*nJW 9

文件说,要继承AbstractEventLoop.

对于你的其余问题,我没有发现文档非常清楚,但具体事件循环的源代码asyncio是有帮助的.我写了一个 非常简单的继承的例子AbstractEventLoop来创建一个事件驱动的模拟器.

我喜欢被告知的主要事情是

  • 实施create_task.最终用户使用调度协程asyncio.ensure_future(coro()),但这只是调用循环的create_task方法.它不需要任何东西 def create_task(self, coro): return asyncio.Task(coro, loop=self).

  • 实施call_soon,call_atcall_later.最终用户调用这些来调度普通回调函数.每当最终用户调度协程时,它们也会由async/await系统自动调用.

  • 如果常规回调引发异常,则转到循环call_exception_handler方法.如果一个协程引发异常,那么异常会存在于一些异步永不落地的情况下,你必须在那里捕获它.

  • 查找源代码AbstractEventLoop以查看您应该覆盖的所有其他方法.奖金:有些有用的评论.