【问题标题】:How to share an aiohttp.ClientSession() between processes?如何在进程之间共享 aiohttp.ClientSession()?
【发布时间】:2020-10-23 08:29:07
【问题描述】:

我正在尝试创建一个共享资源,我可以在其中使用 aiohttp.ClientSession() 对象来获取某些数据。这让我可以使用并行化来加速实际计算。

但是,当我尝试创建一个使用 aiohttp.ClientSession 的管理器时,会出现错误:TypeError: no default __reduce__ due to non-trivial __cinit__

我不确定发生了什么,也许有人可以帮助我了解此错误的含义以及我如何实际初始化使用 aiohttp.ClientSession 的管理器。

import asyncio
import aiohttp

# import nest_asyncio    

from multiprocessing.managers import BaseManager

class Session:
    def __init__(self, loop):
        asyncio.set_event_loop(loop)
        self.session = aiohttp.ClientSession()

class MyManager(BaseManager):
    pass

# nest_asyncio.apply()

MyManager.register('Session', Session)
loop = asyncio.get_event_loop()

with MyManager() as manager:
    session = manager.Session(loop)

作为备用解决方案,我可以使用请求,在 BaseManager 中注册时似乎没有问题。但是,这会严重阻碍我的进程,因为我有相当大的工作负载运行 60 多个并行进程,其中每个数据调用都需要相当长的时间才能完成。

import requests

from multiprocessing.managers import BaseManager

class Session:
    def __init__(self):
        self.session = requests.Session()

class MyManager(BaseManager):
    pass

MyManager.register('Session', Session)

with MyManager() as manager:
    session = manager.Session()

我希望有人可以帮助我,并提前非常感谢!

【问题讨论】:

  • 尝试使用原始aiohttp.ClientSession() 而不是包含asyncio.set_event_loop(loop)。基本上你不应该能够共享那个事件循环。或者至少它没有任何意义。如果你连aiohttp.ClientSession()都不能分享,那就意味着它是完全不可取的。
  • @Sraw 非常感谢!我认为这是不可取的,但根据你的建议,我的经理似乎对使用 aiohttp 非常满意。

标签: python python-3.x python-multiprocessing aiohttp multiprocessing-manager


【解决方案1】:

谢谢斯劳!根据您的建议,我设法创建了一个没有错误的经理!根据asyncio documentation,创建循环的一种修道院和首选方法是简单地调用asyncio.run()

import asyncio
import aiohttp

from multiprocessing.managers import BaseManager

class Session:
    def __init__(self, beta_engine=False):        
        process = self._init_session()
        asyncio.run(process)
        
    async def _init_session(self):
        self.session = aiohttp.ClientSession()
        
class MyManager(BaseManager):
    pass

MyManager.register('Session', Session)

with MyManager() as manager:
    session = manager.Session()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2012-04-09
    • 2011-07-06
    • 2014-10-22
    相关资源
    最近更新 更多