可视化异步协程执行

时间:2019-04-24 05:34:11

标签: python-3.x python-asyncio

我试图了解异步协程如何开始执行。可以说我有这个功能

async def statemachine(state):

执行以下操作:

  1. 在远程服务器上读取值
  2. 写入远程mysql服务器
  3. 写入本地Redis服务器
  4. 从远程mysql服务器删除记录
  5. 创建事件并通知协程执行已完成

由于异步会暂停执行以给其他协程有时间执行,因此执行总是始终从步骤1到步骤5。

1 个答案:

答案 0 :(得分:2)

协程始终按顺序执行。但是,许多(协同)例程可以在事件循环或各种调度程序的监督下(协同)协同工作。

因此,如果您将所有任务堆叠在一个协同程序中,例如:

ACTION_USB_PERMISSION

您的async def statemachine(state): await read_value_on_remote_server() await write_to_remote_mysql_server() await write_to_local_redis_server() await delete_a_record_from_a_remote_mysql_server() await create_event_and_notify_coroutine_execution_has_finished() 将一个接一个地等待每个任务,直到完成。这种情况并不是真正有用,并且与同步代码相比没有任何好处。

异步执行大放异彩的情况是,假设您有一个Web应用程序,该Web应用程序为每个用户请求安排一个statemachine协程。现在,每当用户通过请求访问您的服务器时,都会在eventloop中安排新的协程。而且由于事件循环一次只能运行一件事(伪并发),因此它将让每个协程执行(假设使用循环算法)直到它们暂停,因为它们正在等待对象或另一个协程。等待另一个对象。

协程挂起的方式是通过等待语句。这使事件循环知道协程正在等待未必受CPU约束的操作。例如网络通话或用户输入。

非常感谢,我们不了解事件循环的实现细节以及如何知道何时应恢复协程。通常使用类似Python的stdlib statemachine https://docs.python.org/2/library/select.html之类的库来完成此操作。

对于大多数用例,您应该知道协程始终按顺序执行,并且事件循环是通过使用协作方法(例如,不同于典型的OS调度程序)来管理协程执行的内容。

如果要伪并行运行多个协程,可以查看select或更正确的asycio.gather。希望这会有所帮助。