【问题标题】:asyncio, where Tasks are executed?asyncio,任务在哪里执行?
【发布时间】:2021-07-05 23:39:57
【问题描述】:

我是 asyncio 的新手。看了asyncio documentation,不明白Tasks在哪里运行。

import asyncio

async def query_api(url):
    #http://a.b.c takes 3 seconds
    #http://x.y.z takes 5 seconds

async def main():
    task1 = asyncio.create_task(query_api('http://a.b.c'))
    task2 = asyncio.create_task(query_api('http://x.y.z'))
    
    await task1
    await task2
    print ('Tasks Done')

asyncio.run(main())

This doc 表示 asyncio 有一个在主线程中运行的事件循环。

  • task1 和task2 是否在主线程中运行?如果是这样,它们一定不能并行运行,因为 CPU 一次只能做一件事?
  • Tasks Done 会在 8 秒或更早后出现?

【问题讨论】:

    标签: python python-3.x python-asyncio


    【解决方案1】:

    AsyncIO 是一个运行concurrent 任务的框架。请注意,这里的并发并不意味着并行。

    • task1 和 task2 是否在主线程中运行?如果是这样,它们一定不能并行运行,因为 CPU 一次只能做一件事?

    是的。它们在同一个线程中运行(默认情况下),这意味着它们使用相同的 CPU。但诀窍是我们在进行网络 I/O 时不需要占用 CPU。

    Task1 在网络等待响应时,Task2 可以开始使用 CPU。

    • Tasks Done 会在 8 秒或更早之后出现?

    任务应该在 8 秒前完成

    如果您需要在主线程之外运行任务,则可以使用 asyncIO 使用多线程或多处理。

    【讨论】:

    • Concurrency does not mean parallelism here 我认为这是关于 asyncio 的关键点。使用并发,Task1 和 task2 不能同时启动。有了并行性,他们可以
    猜你喜欢
    • 2014-08-17
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2019-06-06
    • 2018-11-28
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多