【发布时间】: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