py请求会话持久化到redis

时间:2018-07-22 06:55:07

标签: python redis python-requests

我正在尝试在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和服务创建新会话。我想知道什么是处理此问题的最佳方法。我想尽可能避免拥有锁。

0 个答案:

没有答案