一种编程风格,其中任务在等待期间释放CPU,以便其他任务可以使用它。
引入异步任务,
写了事件scheduler,但坚持启用异步task。假设任务是IO绑定的。在任务执行期间,Scheduler不会获得CPU切片,因为任务会同步执行。
当任务使用bar
,async
关键字时,python中的任务(await
)变为异步任务(能够暂停和恢复) ayncio.onSomeIO
有能力的等待,
async def bar():
await asyncio.onSomeIO()
问题:
asyncio
软件包如何启用bar
,使用这些关键字作为异步任务?每个任务是否在单独的线程上启动?
答案 0 :(得分:3)
每个任务是否都在单独的线程上启动?
不,通常asyncio在单线程中运行。
asyncio包如何使用这些来启用bar作为异步任务 关键词,引擎盖下?
当你将函数定义为async
时,这个函数变成了允许执行它的生成器"通过步骤"使用__next__()
方法。 await
- 实际上是yield
(yield from
)执行流返回到管理所有协同程序执行的全局事件循环的点。
这个简单的例子展示了如何在不同生成器的执行流程之间切换:
def task(i):
yield 1
print('task {}: step 1'.format(i))
yield 2
print('task {}: step 2'.format(i))
tasks = [
task(1),
task(2),
task(3),
]
def execute_tasks(tasks):
i = 0
finished = []
while True:
# start executing tasks:
try:
tasks[i].__next__()
except StopIteration:
finished.append(i)
# check if any task unfinished:
if len(finished) == len(tasks):
return
# move to next unfinished task:
while True:
i += 1
if i > len(tasks) - 1:
i = 0
if not i in finished:
break
if __name__ == '__main__':
execute_tasks(tasks)
输出:
task 1: step 1
task 2: step 1
task 3: step 1
task 1: step 2
task 2: step 2
task 3: step 2
asyncio
当然要复杂得多,并且可以为您提供更多。
关于如何使用我在PyCon 2015视频中看到的生成器实现协同程序的最佳解释:David Beazley - Python Concurrency From the Ground Up: LIVE!(source code)。如果你要实现这一点,你一定要看。
但我建议您使用asyncio
代替它 - 它已经存在,您无需创建自己的。