asyncio.gather在调用者从STDIN请求输入时无法执行任务?
创始人
2024-09-21 05:30:22
0

这是由于asyncio.gather在等待所有任务完成时会阻塞事件循环,直到所有任务都完成后才能恢复事件循环。而在从STDIN请求输入时,事件循环在等待输入时也会被阻塞。因此,任务不会被执行直到输入完成。

为了解决这个问题,我们可以使用asyncio.wait()代替asyncio.gather()。这样,事件循环在等待结果时不会被阻塞,任务会被并发执行。

下面是示例代码,演示了如何使用asyncio.wait()来并发执行任务:

import asyncio

async def task1():
    print("Task 1 started")
    await asyncio.sleep(2)
    print("Task 1 completed")

async def task2():
    print("Task 2 started")
    await asyncio.sleep(1)
    print("Task 2 completed")

async def user_input():
    print("Enter something: ")
    result = await asyncio.get_event_loop().run_in_executor(None, input)
    print(f"You entered {result}")

async def main():
    tasks = [task1(), task2(), user_input()]
    done, _ = await asyncio.wait(tasks, return_when=asyncio.FIRST_COMPLETED)
    # Print any results from completed tasks
    for task in done:
        print(task.result())

asyncio.run(main())

在这个例子中,我们创建了三个任务,两个休眠2秒和1秒,另一个等待用户输入。我们使用asyncio.wait()代替asyncio.gather()来并发执行这些任务。我们还使用了asyncio.run_in_executor()在子线程中运行input()函数,以避免阻塞事件循环。

我们将return_when参数设置为asyncio.FIRST_COMPLETED以在至少有一个任务完成时继续事件循环。最后,我们遍历已完成的任务,并打印任何结果。

相关内容

热门资讯

aapoker辅助工具存在!a... 1、aapoker辅助工具存在!aa poker有外挂吗,(wEpOke)从来存在有挂(详细辅助系统...
透视真的(wpk发牌逻辑)wp... 透视真的(wpk发牌逻辑)wpk俱乐部有没有外挂(详细辅助科技教程)从前有挂1、wpk发牌逻辑ai辅...
wepoke辅助机器人!xpo... wepoke辅助机器人!xpoker透视辅助,(wEpoke)确实存在有挂(详细辅助玩家教你)1、点...
透视黑科技(aapoker俱乐... 透视黑科技(aapoker俱乐部)we辅助poker(详细辅助必备教程)先前是有挂;人气非常高,ai...
wpk有辅助挂!德扑之星怎么查... wpk有辅助挂!德扑之星怎么查数据,(wPk)本然真的是有挂(详细透视专业教程)准备好在wpk有辅助...
透视脚本(wepokeai代打... 透视脚本(wepokeai代打)德州哪里有扑克辅助器(详细辅助扑克教程)从来有挂1、构建自己的微扑克...
德州之星有辅助挂!德扑之星有规... 德州之星有辅助挂!德扑之星有规律吗,(WEpoke)从前存在有挂(详细透视普及教程);建议优先通过德...
透视游戏(wepoke真的有挂... 透视游戏(wepoke真的有挂)德州aa扑克透明挂(详细辅助科技教程)总是真的有挂1、在wepoke...
德州之星辅助!德扑线上有机器人... 德州之星辅助!德扑线上有机器人吗,(WpK)本然是真的有挂(详细透视攻略方法);小薇(透视辅助)致您...
透视有挂(智星德州菠萝有挂吗)... 您好,智星德州菠萝有挂吗这款游戏可以开挂的,确实是有挂的,需要了解加微【136704302】很多玩家...