我有一些使用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
我想知道我能做些什么来更好地理解为什么我首先得到这个例外,我该怎样才能防止它发生?