Python从普通函数调用协同程序

2024-09-20 22:21:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个倒计时的脚本,看起来像这样:

import time, threading, asyncio
def countdown(n, m):
    print("timer start")
    time.sleep(n)
    print("timer stop")
    yield coro1

async def coro1():
    print("coroutine called")

async def coromain():
    print("first")
    t1 = threading.Thread(target=countdown, args=(5, 0))
    t1.start()
    print("second")

loop = asyncio.get_event_loop()
loop.run_until_complete(coromain())
loop.stop()

我想让它做的很简单:

^{pr2}$

但是,当我运行此代码时,它会输出:

Run coromain
Print "first"
Print "second"
exit

我很困惑它为什么会这样。谁能解释一下我做错了什么吗?在


Tags: loopasyncioasynctimedefstartfirststop
2条回答

这取决于您的问题是否是施加额外约束的更大问题的一部分,但我看不出使用threading的原因。相反,您可以使用在同一事件循环中运行的两个独立的Task,这是异步编程的要点之一:

import asyncio

async def countdown(n, m):  # <- coroutine function
    print("timer start")
    await asyncio.sleep(n)
    print("timer stop")
    await coro1()

async def coro1():
    print("coroutine called")

async def coromain():
    print("first")
    asyncio.ensure_future(countdown(5, 0))  # create a new Task
    print("second")

loop = asyncio.get_event_loop()
loop.run_until_complete(coromain())  # run coromain() from sync code
pending = asyncio.Task.all_tasks()  # get all pending tasks
loop.run_until_complete(asyncio.gather(*pending))  # wait for tasks to finish normally

输出:

^{pr2}$

使用^{}时,可以在单个操作系统线程内有效地创建一个新的“执行线程”(请参见纤程)。在

经过一番挖掘,这是一个解决办法。它可能不漂亮,但很管用:

import time, threading, asyncio
def countdown(n, m):
    print("timer start")
    time.sleep(n)
    print("timer stop")
    looptemp = asyncio.new_event_loop()
    asyncio.set_event_loop(looptemp)
    loop2 = asyncio.get_event_loop()
    loop2.run_until_complete(coro1())
    loop2.close()

async def coro1():
    print("coroutine called")

async def coromain():
    print("first")
    t1 = threading.Thread(target=countdown, args=(5, 0))
    t1.start()
    print("second")

loop = asyncio.get_event_loop()
loop.run_until_complete(coromain())
loop.stop()

不幸的是,它不适用于我的特定用例,但我认为它可能有用。在

相关问题 更多 >

    热门问题