为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

青春有我 2023-12-29 16:07:13
我有一个主线程,它始终需要可用于读取键盘按键输入。每次按键时,我必须运行 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_APIasyncio.run(main())    我是否应该尝试一些额外的逻辑,在递归调用 asyncio.tasks 后进行更多循环?或者我应该考虑多线程,让一个线程活动运行 key_press() 并在其他地方进行异步调用?有什么想法或暗示朝着好的方向发展吗?
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

如果您尝试借助input(key_press示例中的函数)模拟USB数据流,则必须使用multithreading模块,因为它input是一个阻塞函数,它将停止asyncio线程中的循环工作。要asyncio与input函数结合,您必须使用另一个线程,请查找以下示例:


import asyncio

import threading



async 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 t3



def 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()


查看完整回答
反对 回复 2023-12-29
  • 1 回答
  • 0 关注
  • 48 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信