From 42ec4449d8a0de92de8929e0e48c2911e70d55ff Mon Sep 17 00:00:00 2001 From: "zhen.chen" Date: Wed, 14 Apr 2021 14:42:34 +0800 Subject: [PATCH] feat(client): make session safe in multiprocesses environment SSL may raise error when reusing the same session for multiprocesses related issue: https://github.com/psf/requests/issues/4323 --- tensorbay/client/requests.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/tensorbay/client/requests.py b/tensorbay/client/requests.py index 383691a33..56d48807d 100644 --- a/tensorbay/client/requests.py +++ b/tensorbay/client/requests.py @@ -12,6 +12,7 @@ """ import logging +import os from concurrent.futures import FIRST_EXCEPTION, ThreadPoolExecutor, wait from itertools import count, repeat, zip_longest from typing import ( @@ -198,7 +199,7 @@ def __init__(self, access_key: str, url: str = "") -> None: self.gateway_url = urljoin(url, "gatewayv2/") self.access_key = access_key - self.session = UserSession() + self._session: Dict[int, UserSession] = {} self._open_api = urljoin(self.gateway_url, "tensorbay-open-api/v1/") def _url_make(self, section: str, dataset_id: str = "") -> str: @@ -222,6 +223,20 @@ def _url_make(self, section: str, dataset_id: str = "") -> str: url = urljoin(self._open_api, "datasets") return url + @property + def session(self) -> UserSession: + """Create and return a session per PID so each sub-processes will use their own session. + + Returns: + The session corresponding to the process. + """ + pid = os.getpid() + + if pid not in self._session: + self._session[pid] = UserSession() + + return self._session[pid] + def open_api_do( self, method: str, section: str, dataset_id: str = "", **kwargs: Any ) -> Response: