Python asyncio 等待并通知

Python asyncio wait and notify

我正在尝试做类似 C# ManualResetEvent 的事情,但是在 Python.

我曾尝试在 python 中执行此操作,但似乎没有用。

import asyncio

cond = asyncio.Condition()

async def main():
    some_method()

    cond.notify()

async def some_method():
    print("Starting...")
    
    await cond.acquire()
    await cond.wait()
    cond.release()
    
    print("Finshed...")

main()

我想让 some_method 启动,然后等到发出再次启动的信号。

此代码不完整,首先您需要使用 asyncio.run() 到 bootstrap 事件循环 - 这就是您的代码根本不是 运行 的原因。

其次,some_method() 从未真正开始。您需要使用 asyncio.create_task() 异步启动 some_method()。当你调用一个“async def 函数”(更正确的术语是协程函数)时,它 returns 一个协程对象,这个对象需要由你 await 的事件循环驱动或使用 before-mentioned 函数。

您的代码应该更像这样:

import asyncio

async def main():
    cond = asyncio.Condition()

    t = asyncio.create_task(some_method(cond))

    # The event loop hasn't had any time to start the task
    # until you await again. Sleeping for 0 seconds will let
    # the event loop start the task before continuing.
    await asyncio.sleep(0)
    cond.notify()

    # You should never really "fire and forget" tasks,
    # the same way you never do with threading. Wait for
    # it to complete before returning:
    await t

async def some_method(cond):
    print("Starting...")
    
    await cond.acquire()
    await cond.wait()
    cond.release()
    
    print("Finshed...")

asyncio.run(main())