【问题标题】:python 3.7 async http requests to cosmos dbpython 3.7 对 cosmos db 的异步 http 请求
【发布时间】:2019-10-30 16:40:59
【问题描述】:

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

请注意,“__save_to_cosmos”方法是使用 python SDK 及其同步代码向 Cosmos DB 发送 HTTP 请求,因为据我所知 Cosmos DB SDK 不支持异步操作。

谁能建议是否有更好的方法来完成这项任务?

【问题讨论】:

  • 嗨,现在有更新吗?

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


【解决方案1】:

谁能建议是否有更好的方法来完成这项任务?

嗯,很难完美地回答这样的问题。我试图根据我的知识与你分享一些想法。根据bulk executor document,Cosmos db 仅支持.netjava 库。所以需要自己封装Python的bulk方法。

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

multiprocessing 是一个支持使用 API 类似于 threading 模块。多处理包 提供本地和远程并发,有效地回避 通过使用子进程而不是线程来全局解释器锁。 因此,多处理模块允许程序员完全 在给定机器上利用多个处理器。

根据我的理解,asyncio 让您的任务在事件循环(单个进程)中运行,而 multiprocessing 让您的 asyncio 任务同时在多个进程上运行,这样您就可以充分利用机器的容量。

请通过link了解更多关于它们之间的区别。您可以尝试结合asynciomultiprocessing,请参考这些线程:

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

2.github:https://github.com/dano/aioprocessing

【讨论】:

  • @RajatArora 不客气!希望这对您的测试有所帮助。
猜你喜欢
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-23
  • 2019-01-11
  • 1970-01-01
  • 2022-11-28
  • 1970-01-01
相关资源
最近更新 更多