1. 资源管理
- 控制协程数量:使用
gevent.pool.Pool
来限制并发协程的数量,避免过多协程占用大量内存。
import gevent
from gevent.pool import Pool
pool = Pool(100) # 最多允许100个协程并发执行
def task():
# 网络请求等任务逻辑
pass
jobs = [pool.spawn(task) for _ in range(1000)]
gevent.joinall(jobs)
- 及时释放资源:在协程执行完任务后,确保相关资源(如文件句柄、网络连接等)被正确关闭。例如在使用
requests
库进行网络请求时:
import gevent
import requests
def fetch_data(url):
try:
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
return response.json()
finally:
# 这里可以添加清理资源的代码,requests库在请求结束后会自动清理连接等资源
pass
urls = ['http://example.com' for _ in range(100)]
jobs = [gevent.spawn(fetch_data, url) for url in urls]
gevent.joinall(jobs)
2. 异常处理
- 捕获异常:在协程函数内部使用
try - except
块捕获网络请求过程中的异常。
import gevent
import requests
def fetch_data(url):
try:
response = requests.get(url, timeout = 5) # 设置超时时间为5秒
response.raise_for_status()
return response.json()
except requests.exceptions.Timeout:
print(f"请求 {url} 超时")
except requests.exceptions.ConnectionError:
print(f"请求 {url} 连接错误")
except requests.exceptions.HTTPError as http_err:
print(f"请求 {url} 出现HTTP错误: {http_err}")
except Exception as err:
print(f"请求 {url} 出现其他错误: {err}")
urls = ['http://example.com' for _ in range(100)]
jobs = [gevent.spawn(fetch_data, url) for url in urls]
gevent.joinall(jobs)
- 异常传播与集中处理:也可以将异常抛出,在
joinall
时统一处理。
import gevent
import requests
def fetch_data(url):
response = requests.get(url, timeout = 5)
response.raise_for_status()
return response.json()
urls = ['http://example.com' for _ in range(100)]
jobs = [gevent.spawn(fetch_data, url) for url in urls]
try:
gevent.joinall(jobs)
except (requests.exceptions.Timeout, requests.exceptions.ConnectionError, requests.exceptions.HTTPError) as err:
print(f"捕获到异常: {err}")