异步 HTTP 请求,不会阻塞主线程

我有一个主线程,它始终需要可用于读取键盘按键输入。


每次按键时,我必须运行 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() 并在其他地方进行异步调用?有什么想法或暗示朝着好的方向发展吗?


青春有我
浏览 127回答 1
1回答

哆啦的时光机

如果您尝试借助input(key_press示例中的函数)模拟USB数据流,则必须使用multithreading模块,因为它input是一个阻塞函数,它将停止asyncio线程中的循环工作。要asyncio与input函数结合,您必须使用另一个线程,请查找以下示例:import asyncioimport threadingasync def do_work(i):    """take input key and do some work with the input"""    await asyncio.sleep(5)    print(i)async def main_thread_loop_work(_key):    """simulate multiple tasks caused by key input"""    t1 = asyncio.create_task(do_work(_key))    t2 = asyncio.create_task(do_work(_key))    t3 = asyncio.create_task(do_work(_key))    await t1    await t2    await t3def thead_worker(_key):    """target function for another thread"""    asyncio.run(main_thread_loop_work(_key))if __name__ == '__main__':    while True:        some_key = input("Please provide any key: ")        th = threading.Thread(target=thead_worker, args=(some_key, ))        th.start()
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python