如何稳健地调试gevent'此操作将永久阻止'例外?

时间:2015-03-26 12:42:01

标签: python python-2.7 python-requests gevent monkeypatching

我有一些使用gevent的并发代码:

gevent.monkey.patch_all()

....

jobs = [gevent.spawn(self.generate_resource_cache, idx, resource, id_fields_map[resource])
                for idx, resource in enumerate(available_resources)]
gevent.joinall(jobs)

我的generate_resource_cache方法正在使用requests库,这意味着我需要mankeypatch gevent

使用requests,我正在使用自定义会话:

def get_session(self):
    s = Settings.Instance()
    if not self.session:
        retry = Retry(total=s.TOTAL_RETRIES, backoff_factor=s.BACKOFF_FACTOR,
                status_forcelist=(range(400, 421) + range(500, 505)))
        size = s.CONCURRENT_SIZE
        adapter = requests.adapters.HTTPAdapter(pool_connections=size, pool_maxsize=size, pool_block=True, max_retries=retry)
        self.session = requests_cache.CachedSession(s.CACHE_NAME, backend='sqlite',
            fast_save=s.FAST_SAVE, allowable_methods=('GET', 'POST')) if s.CACHING else requests.Session()
        if s.PROXIES:
            self.session.proxies = s.PROXIES
        self.session.headers.update({'X_HTTP_METHOD_OVERRIDE' : 'get'})
        self.session.mount('http://', adapter)
        self.session.mount('https://', adapter)
    return self.session

运行此脚本几个小时后,它将打印到stdout:

WARNING:root:epoll module not found; using select()

对于stderr:

Exception caught: This operation would block forever

我想知道我能做些什么来更好地理解为什么我首先得到这个例外,我该怎样才能防止它发生?

0 个答案:

没有答案