0

我正在尝试创建一个共享资源,我可以在其中使用 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()

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

4

1 回答 1

0

谢谢斯劳!根据您的建议,我设法创建了一个没有错误的经理!根据asyncio 文档,创建循环的一种修道院和首选方法是简单地调用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()
于 2020-07-02T19:10:06.550 回答