【发布时间】: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