gpt4 book ai didi

Python 事件循环不能与 stdin 一起正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:33 26 4
gpt4 key购买 nike

我正在努力了解 python 的 asyncio。我写这段代码只是为了演示清楚概念。

import asyncio
import threading


async def printer(b, a):
print(b)
await asyncio.sleep(5)
print(a)


def loop_runner(loop):
print('[RUNNING LOOP]')
loop.run_forever()


if __name__ == '__main__':
event_loop = asyncio.get_event_loop()
# run_forever() is blocking. running it from separate thread
loop_thread = threading.Thread(target=loop_runner, args=(event_loop,))
loop_thread.start()

while True:
before, after = input('Before :'), input('After :')
event_loop.create_task(printer(before, after))

我正在从单独的线程运行事件循环,并尝试在运行时循环创建任务。但我不明白为什么这段代码不起作用。它接受输入,然后进入下一次迭代,而不从 printer 函数打印任何内容。

令人惊讶的是,如果我不从 stdin 获取输入,而只是使用像这样的硬编码消息

   messages = [('Hello', 'world'), ('Foo', 'bar'), ('Alice', 'Bob')]

for message in messages:
before, after = message
coroutine = printer(f'[ITERATION] {count} [MESSAGE] {before}', f'[ITERATION] {count} [MESSAGE] {after}')
event_loop.create_task(coroutine)
count += 1

一切正常。输出

[RUNNING LOOP]
[ITERATION] 0 [MESSAGE] Hello
[ITERATION] 1 [MESSAGE] Foo
[ITERATION] 2 [MESSAGE] Alice
[ITERATION] 0 [MESSAGE] world
[ITERATION] 1 [MESSAGE] bar
[ITERATION] 2 [MESSAGE] Bob

请通过input帮助我理解这种行为

最佳答案

您在第一次设置中不正确地使用了 asyncio。您不需要将其与线程模块插入。

为此,我推荐的设置是创建一个异步函数 main,其中包含一个无限循环,您可以在其中请求输入并创建任务。然后,您可以在完成声明后从事件循环运行 main。

请注意,在上面的设置中等待您在 main 中创建的任务是可选的;因为 stdout 保证由内核同步(我有 70% 的把握确定这是真的,)你可以同时运行 printer() 来执行任意多的任务。然而,如果你确实等待任务,你的程序将不会在用户尝试输入时打印出来;它会调用 printer(),它首先写入标准输出,并且仅在 printer() 完成后才请求下一组输入。

希望这能回答您的问题。请参阅以下文档作为附加资源。

https://docs.python.org/3/library/asyncio-task.html

关于Python 事件循环不能与 stdin 一起正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56350166/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com