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

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

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

引入异步任务,

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

写入事件scheduler ,但坚持启用异步 task 。假设任务受 IO 限制。调度程序在任务执行过程中不会获取 CPU 切片,因为任务是同步执行的。


Python中的任务(bar),成为异步任务(能够暂停和恢复),当任务使用asyncawait <具有ayncio.onSomeIO功能等待的strong>关键字,

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

问题:

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

最佳答案

Does each task get launched on separate thread?

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

How asyncio package enables bar, to be an async task, with these keywords, under the hood?

当您将函数定义为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 - 它已经为您提供了,无需发明自己的。

关于python - python asyncIO如何暂停和恢复任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45661770/

相关文章:

python - 如何在 Pandas 中对时间序列数据进行特征大小处理?

c - libcurl easy handle 'CURLOPT_RANGE' 选项不起作用

javascript - 如何从异步调用返回响应?

java - 如何实现异步计算?

python - 如何动态获取 pytest fixture 数据

python - 字典理解中的字典合并

python - 如何与 Kivy GUI 一起运行 Tornado 事件循环?

python - 生菜、 Django 的背景

python 重复程序而为真

python - 如何在 Pandas 中调试 Cython 代码?