【问题标题】:Understanding Python Concurrency with Asyncio使用 Asyncio 了解 Python 并发
【发布时间】:2018-03-05 21:29:54
【问题描述】:

我想知道在带有 asyncio 的 python 3.6 中并发是如何工作的。我的理解是,当解释器执行await 语句时,它会将其保留在那里,直到等待过程完成,然后继续执行其他协程任务。但是我在下面的代码中看到的不是那样的。程序同步运行,一个一个地执行任务。

我的理解和实现代码有什么问题?

import asyncio import time async def myWorker(lock, i): print("Attempting to attain lock {}".format(i)) # acquire lock with await lock: # run critical section of code print("Currently Locked") time.sleep(10) # our worker releases lock at this point print("Unlocked Critical Section") async def main(): # instantiate our lock lock = asyncio.Lock() # await the execution of 2 myWorker coroutines # each with our same lock instance passed in # await asyncio.wait([myWorker(lock), myWorker(lock)]) tasks = [] for i in range(0, 100): tasks.append(asyncio.ensure_future(myWorker(lock, i))) await asyncio.wait(tasks) # Start up a simple loop and run our main function # until it is complete loop = asyncio.get_event_loop() loop.run_until_complete(main()) print("All Tasks Completed") loop.close()

【问题讨论】:

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


    【解决方案1】:

    在 asyncio 协程中调用诸如 time.sleep 之类的阻塞调用会阻塞整个事件循环,从而违背了使用 asyncio 的目的。

    time.sleep(10) 更改为await asyncio.sleep(10),代码将按照您的预期运行。

    【讨论】:

    • 除了所有协程都想要相同的锁,所以锁无论如何都会保持同步。
    • @user2357112 这里没有参数,但这大概是 OP 所期望的行为 - 为什么他们会插入显式锁?
    • @user4815162342 哇!这确实是问题所在。所以这就是异步事情不起作用的原因,因为循环被阻塞了。谢谢你的回答兄弟。
    【解决方案2】:

    asyncio 使用循环来运行所有内容,await 会将控制权交还给循环,以便安排下一个协程运行。

    【讨论】:

      猜你喜欢
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-06
      • 2021-04-17
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      相关资源
      最近更新 更多