您可以将协程添加到事件循环队列的前面吗?

时间:2018-10-08 11:06:07

标签: python-asyncio

是否有一种创建任务的方法,但可以让它专门在事件循环中运行下一个任务?

假设我有一个事件循环,当前正在运行几个低优先级的协程。可能会出现一些高优先级的API请求任务,我想立即异步发出这些请求,然后将控制权交还给循环中以前的任务。

我意识到网络请求的延迟要比通过在循环中对协作任务重新排序节省的几个CPU周期大几个数量级,但是我仍然对是否有办法实现这一点感到好奇。

1 个答案:

答案 0 :(得分:2)

  

我想立即异步发出这些请求,然后将控制权交还给循环中以前的任务。

在当前异步中,所有可运行的任务都驻留在非优先级queue中,因此无法做到这一点。

但是上述要求存在一个更深层次的问题。异步任务可能会在每个阻塞的IO调用处或更普遍地在每个await处将控制权交给事件循环。因此,“立即”和“异步”不能同时使用:真正的异步操作不能立即进行,因为它必须是可挂起的,并且在挂起时将继续执行其他任务。

如果您真的想立即发生某事,则需要同步。无论如何,其他任务都将被阻止,因为同步操作将不允许它们运行。

这可能是asyncio不支持任务优先级的原因。就其性质而言,任务以可以任意方式交错的短片段执行,因此它们的执行顺序通常并不重要。如果顺序确实很重要,则可以使用provided同步设备。

相关问题