簡體   English   中英

如何在進程之間共享 aiohttp.ClientSession()?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM