我试图了解异步协程如何开始执行。可以说我有这个功能
async def statemachine(state):
执行以下操作:
由于异步会暂停执行以给其他协程有时间执行,因此执行总是始终从步骤1到步骤5。
答案 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
。希望这会有所帮助。