【问题标题】:fire and forget a post request using asyncio使用 asyncio 触发并忘记发布请求
【发布时间】:2021-04-17 07:08:57
【问题描述】:

我必须向 api 发出 post 请求,该 api 会进行一些处理,大约需要 5-10 分钟才能返回。但我不必等待那个 api 返回。我只想从我的 AWS Batch 作业中触发该 api 并离开它。

def post_id(id):
   # this function does a post using requests library

async def submit_post_requests(id_list):
    loop = asyncio.get_event_loop()
    excutor =  concurrent.futures.ThreadPoolExecutor(THREAD_COUNT)
    for id in set(id_list):
        loop.run_in_executor(excutor, post_id, id)

if __name__ == '__main__':
    id_list = [1,2,3]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(submit_post_requests(id_list))
    print('reached end of program')

我的代码类似于上面的代码。当我运行它时,它一直到程序结束并打印reached end of program,但程序没有退出。关于如何在不等待发布请求完成的情况下退出程序的任何建议。

我知道不等待后期返回不是一个好习惯,但我不必等待它并尝试尽快退出批处理。

我使用这个堆栈溢出问题作为参考:How could I use requests in asyncio?

唯一的问题是程序在协程完成之前不会退出。

【问题讨论】:

  • 最好使用基于异步的库。 Example
  • @alex_noname 这是一个很好的一般建议,但我不确定它是否解决了 OP 的问题,即发送请求而不等待响应。 (我不确定它是否可以可靠地完成。)
  • @alex_noname 即使使用 aiohttp,我仍然需要等待它退出。在我的特殊情况下它不起作用。
  • 你是对的。两者都可以使用较短的超时时间,但这并不能保证请求会到达服务器。但是您可以选择一个(几乎)始终在给定条件下工作的时间段。

标签: python post async-await python-requests python-asyncio


【解决方案1】:

由于线程仍在执行请求,程序未退出。

Aiohttp 或其他不会以这种方式启动。

我建议为此操作创建分离和分叉的进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2020-01-31
    • 2020-04-25
    相关资源
    最近更新 更多