我是Python的新手,我想使用Python将异步HTTP请求发送到cosmos DB以执行批量插入操作。我尝试将多线程与asyncio一起使用以实现此任务。它已经给我带来了不错的性能,但是我相信可以肯定可以进一步改进,这是代码:
try:
loop = asyncio.new_event_loop()
return loop.run_until_complete(save(request.json))
except ValidationException as e:
return send_error(e)
async def save(self, users):
with concurrent.futures.ThreadPoolExecutor(max_workers=20) as executor:
loop = asyncio.get_event_loop()
futures = [
loop.run_in_executor(
executor,
self.__save_to_cosmos,
user
)
for user in users
]
result = await asyncio.gather(*futures)
return result
请注意,由于据我所知Cosmos DB SDK不支持异步操作,因此“ __save_to_cosmos”方法正在使用python SDK及其同步代码将HTTP请求发送至Cosmos DB。
任何人都可以建议是否有更好的方法来完成此任务?
答案 0 :(得分:1)
任何人都可以建议是否有更好的方法来完成此任务?
好吧,很难完美地回答这样的问题。据我所知,我试图与您分享一些想法。根据{{3}},Cosmos db仅支持.net
和java
库。因此,您需要自己封装Python的bulk方法。
当前,您使用asyncio
程序包,该程序包使用事件循环来处理将要处理的内容。一切都在单个进程和单个线程上运行。在此基础上,我认为您可以使用multiprocessing
软件包来进一步提高效率。请参考multiprocessing
软件包bulk executor document:>
multiprocessing是一个程序包,它支持使用以下命令生成程序 API与线程模块相似。多处理包 提供本地和远程并发,有效地避免了 通过使用子进程而不是线程来使用全局解释器锁。 因此,多处理模块使程序员能够完全 在给定的计算机上利用多个处理器。
根据我的理解,asyncio让您的任务在事件循环(单个进程)中运行,而多处理则使asyncio任务同时在多个进程中运行,以便您可以充分利用计算机的容量。
请从此document了解有关它们之间的区别的更多信息。您可以尝试合并asyncio
和multiprocessing
,请参考以下主题:
1。link
2.github:What kind of problems (if any) would there be combining asyncio with multiprocessing?