python asyncIO如何暂停和恢复任务?

python asyncIO如何暂停和恢复任务?

问题描述:

一种编程风格,其中任务在等待期间释放CPU,以便其他任务可以使用它。python asyncIO如何暂停和恢复任务?

要引入异步任务,

  • 任务应该能够暂停&恢复
  • 事件调度应该安排这些任务(准备好时)

写事件scheduler,但卡在启用异步task。假设任务被IO绑定。调度程序在任务执行过程中不会获得CPU分片,因为任务会同步执行。


Python中的任务(bar),成为异步任务(可暂停&恢复),当任务使用asyncawait关键字ayncio.onSomeIO能够等待,

async def bar(): 
    await asyncio.onSomeIO() 

问题:

如何asyncio包使bar成为一个异步任务,与这些关键字,在引擎盖下?每个任务是否在单独的线程上启动?

+3

您可能想看看下面的[Brett Cannon的文章](https://snarky.ca/how-the-heck-does-async-await-work-in-python-3-5/)异步/等待的底线是什么?它非常深入,但它不是一个可以在S/O上轻松实现的主题。 – Gavin

是否每个任务都在单独的线程上启动?

不,通常asyncio在单线程中运行。

asyncio软件包如何使用这些 关键字使栏成为异步任务?

当你定义功能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来代替它 - 它已经存在,无需自己创造。

+0

我们可以请求一些IO绑定操作来代替'yield 1'吗?我有这个代码[这里](https://github.com/shamhub/DataProcsngAnalytics/tree/master/1_Pipeline_processing)没有事件循环 – overexchange

+0

@overxchange尝试查看视频中的代码我给了上面的链接(我添加了链接代码在那里)。 'run()'那里 - 实际上是事件循环。 1)它告诉任务要执行,直到I/O操作(第43行)2)任务在I/O操作中产生,以将控制权返回到事件循环(第82,88,94,96行)3)当事件循环查看所有待处理任务它使用'select'来等待一些I/O完成(第33行)。 –

+0

Pycon介绍令人惊叹。不知道,我怎么错过了? – overexchange