python 3.7向cosmos db异步http请求

时间:2019-10-30 16:40:59

标签: python python-3.x azure-cosmosdb

我是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。

任何人都可以建议是否有更好的方法来完成此任务?

1 个答案:

答案 0 :(得分:1)

  

任何人都可以建议是否有更好的方法来完成此任务?

好吧,很难完美地回答这样的问题。据我所知,我试图与您分享一些想法。根据{{​​3}},Cosmos db仅支持.netjava库。因此,您需要自己封装Python的bulk方法。

当前,您使用asyncio程序包,该程序包使用事件循环来处理将要处理的内容。一切都在单个进程和单个线程上运行。在此基础上,我认为您可以使用multiprocessing软件包来进一步提高效率。请参考multiprocessing软件包bulk executor document

  

multiprocessing是一个程序包,它支持使用以下命令生成程序   API与线程模块相似。多处理包   提供本地和远程并发,有效地避免了   通过使用子进程而不是线程来使用全局解释器锁。   因此,多处理模块使程序员能够完全   在给定的计算机上利用多个处理器。

根据我的理解,asyncio让您的任务在事件循环(单个进程)中运行,而多处理则使asyncio任务同时在多个进程中运行,以便您可以充分利用计算机的容量。

请从此document了解有关它们之间的区别的更多信息。您可以尝试合并asynciomultiprocessing,请参考以下主题:

1。link

2.github:What kind of problems (if any) would there be combining asyncio with multiprocessing?