[英]How to share (initialize and close) aiohttp.ClientSession between Django async views to use connection pooling
[英]How to share an aiohttp.ClientSession() between processes?
我正在嘗試創建一個共享資源,我可以在其中使用 aiohttp.ClientSession() object 來獲取某些數據。 這允許我使用並行化來加速實際計算。
但是,當我嘗試創建使用 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()
我希望有人可以幫助我,並提前非常感謝!
謝謝斯勞! 根據您的建議,我設法創建了一個沒有錯誤的經理! 根據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()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.