У меня есть простой скрипт, я хочу, чтобы пользователь мог вводить что-то, когда захочет, но я также хочу что-то распечатать в середине, это мой код:
import asyncio
async def user_input():
while True:
content = input('> ')
async def print_something():
await asyncio.sleep(10)
print('something')
async def main():
tasks = [user_input(), print_something()]
await asyncio.gather(*tasks)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
Он позволяет мне вводить, но не печатает something
, как мне этого добиться?
Короткий ответ: асинхронность не может делать то, что вы хотите. Хотя вы объявили свои функции асинхронными, функция Python input
не является асинхронной, это блокирующая функция. Таким образом, он заблокирует цикл событий, и больше ничего не будет выполняться.
Некоторое время назад я ответил на вопрос, который как бы объясняет, как работает асинхронность в python. Я свяжу это. Но чтобы делать то, что вы хотите, вам нужно использовать потоки, а не асинхронные. https://stackoverflow.com/a/63237798/9270488
Если вы хотите использовать потоки с асинхронностью, загляните в ThreadExecutor
input
— это функция блокировки, и ее нельзя напрямую использовать с внутренними сопрограммами. Но вы можете запустить его в отдельной теме с помощью run_in_executor
:
import asyncio
async def user_input():
while True:
loop = asyncio.get_event_loop()
content = await loop.run_in_executor(None, input, "> ")
print(content)
async def print_something():
await asyncio.sleep(5)
print('something')
async def main():
tasks = [user_input(), print_something()]
await asyncio.gather(*tasks)
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()
Обновление: также вы можете использовать библиотеку aioconsole, которая предоставляет консольные функции на основе asyncio:
from aioconsole import ainput
async def user_input():
while True:
content = await ainput(">")
print(content)
Боже мой, спасибо, каждый второй ответ рекомендует 10-30 строк заводской упаковки java-esque для стандартного ввода и стандартного вывода, а не просто использовать уже существующую функцию «ввода». Это должен быть ответ на все остальные вопросы.