我正在尝试在Redis中存储py请求会话以获取特定的ID和服务。因此,对于特定的ID和服务,redis中应该只存储一个py-request-session。
def __init__(self, data, method):
self.data = data
self.method = method
def http_call(self):
session = self._load(self.data['id'], self.data['service'])
handler = getattr(self, self.method.lower())
resp = handler(session=session, data=params, options=self.optional_params)
self._store(self.data['id'], self.data['service'], session)
return resp
def post(self, session=None, data=None, json=None, options=None):
req = session or requests
return req_obj.post(self.target, data=data, json=json, **options)
def get(self, session=None, data=None, options=None):
request = session or requests
return request.get(self.target, params=data, **options)
@staticmethod
def _load(id=None, service=None):
session = REDIS.get('{}_{}'.format(id, service))
if session is None:
session = requests.session()
else:
session = pickle.loads(session)
return session
@staticmethod
def _store(id=None, service=None, session=None):
return REDIS.set('{}_{}'.format(id, service), pickle.dumps(session))
上面是一个示例代码,可以由多个线程调用http_call api。我在上面的代码中看到的一个问题是,如果针对一个特定ID和服务的多个线程同时执行,则可能会同时对同一个(ID和服务)进行_load()调用,而Redis会对所有这些线程返回None,从而导致所有线程为相同的ID和服务创建新会话。我想知道什么是处理此问题的最佳方法。我想尽可能避免拥有锁。