如何python asyncIO,暂停&恢复任务?

时间:2017-08-13 15:07:25

标签: python asynchronous python-3.5 python-asyncio event-loop

一种编程风格,其中任务在等待期间释放CPU,以便其他任务可以使用它。

引入异步任务,

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

写了事件scheduler,但坚持启用异步task。假设任务是IO绑定的。在任务执行期间,Scheduler不会获得CPU切片,因为任务会同步执行。

当任务使用barasync 关键字时,python中的任务(await)变为异步任务(能够暂停和恢复) ayncio.onSomeIO有能力的等待,

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

问题:

asyncio软件包如何启用bar,使用这些关键字作为异步任务?每个任务是否在单独的线程上启动?

1 个答案:

答案 0 :(得分:3)

  

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

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

  

asyncio包如何使用这些来启用bar作为异步任务   关键词,引擎盖下?

当你将函数定义为async时,这个函数变成了允许执行它的生成器"通过步骤"使用__next__()方法。 await - 实际上是yieldyield 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代替它 - 它已经存在,您无需创建自己的。