Python 不阻塞主线程的异步HTTP请求

Python 不阻塞主线程的异步HTTP请求,python,python-3.x,multithreading,python-asyncio,aiohttp,Python,Python 3.x,Multithreading,Python Asyncio,Aiohttp,我有一个主线程,它总是需要能够读取键盘按键输入 在每个按键上,我必须运行4个功能,例如显示、保存到文件和发出HTTP请求等 按键可能比执行4个功能更快 我的逻辑如下,但我不知道如何保持key_press()始终运行,因为我必须等待函数在某个点完成 async def main(): async with aiohttp.ClientSession() as client: while True: pressed_key = key_press() if pressed_

我有一个主线程,它总是需要能够读取键盘按键输入

在每个按键上,我必须运行4个功能,例如显示、保存到文件和发出HTTP请求等

按键可能比执行4个功能更快

我的逻辑如下,但我不知道如何保持key_press()始终运行,因为我必须等待函数在某个点完成

async def main():
  async with aiohttp.ClientSession() as client:
  while True:
    pressed_key = key_press() 
    if pressed_key != "":
        f1 = asyncio.create_task(do_something1())
        f2 = asyncio.create_task(do_something2())
        f3 = asyncio.create_task(do_something3())
        f4 = asyncio.create_task(send_to_API())
        
    await f1,f2,f3,send_to_API

asyncio.run(main())
    
在递归调用asyncio.tasks之后,我是否应该尝试一些额外的逻辑,使用更多的循环?或者我应该考虑多线程,让线程运行key_press()并在别处执行异步调用?
有什么好的想法或提示吗?

如果您试图借助
输入
按键
函数)来模拟USB数据流,您必须使用
多线程
模块,因为
input
是一个阻塞函数,它将停止线程中的
asyncio
循环工作。要将
asyncio
input
函数组合,您必须使用另一个线程,请查找以下示例:

导入异步IO
导入线程
异步def do_工作(i):
“”“获取输入键并对输入执行一些操作”“”
等待异步睡眠(5)
印刷品(一)
异步def主线程循环工作(_键):
“”“模拟由键输入引起的多个任务”“”
t1=asyncio.create_任务(do_work(_key))
t2=异步。创建任务(执行工作(_键))
t3=asyncio.create_任务(do_work(_key))
等待t1
等待t2
等待t3
定义辅助工作者(_键):
“”“其他线程的目标函数”“”
运行(主线程循环工作(_键))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
尽管如此:
some_key=输入(“请提供任何键:”)
threading.Thread(target=thead\u worker,args=(some\u key,)
th.start()

操作系统不会为您缓冲击键吗?如果用户按键太快,其他功能无法跟上,操作系统将一直按住按键,直到您开始阅读。在这个阶段,我使用按键,但在不同的阶段,我将从其他类似的HID设备转到USB输入,因此我无法使用操作系统缓冲区。谢谢,我还是没看到问题。操作系统还必须缓冲USB输入。一旦应用程序运行完这四个函数,它就可以对下一个输入做出反应。下一位数据是否一直在操作系统缓冲区中等待似乎无关紧要。应用程序的运行速度不能超过这四个函数所允许的速度,因此在任何情况下都必须等待下一个输入。您是否担心操作系统会在您读取数据之前将其丢弃?