我在谷歌上快速搜索了一下,找不到任何明确的说法。基本上,我正在尝试从SQS读取事件并处理它们,而asio预计将由greenlet处理。
那么在greenlet中可以使用的boto3的粒度是多少呢?每个greenlet是否需要会话/客户端?我需要额外的互斥量吗?
发布于 2017-10-31 20:13:35
Boto3没有,但你可以用猴子补丁botocore。
在你的模块的顶部,你总是需要先用猴子补丁,然后再使用botocore会话,例如:
from gevent import monkey
monkey.patch_all()
import botocore.session
def fetch_file(bucket, key):
session = botocore.session.get_session()
client = session.create_client('S3')
return client.get_object(
Bucket=bucket,
Key=key
)
result = gevent.spawn(fetch_file('mybucket', 'sd.txt'))
更新03.04.2021
我刚刚检查并验证了gevent monkey_patch方法可以与boto3一起工作:
from gevent import monkey, spawn, joinall
monkey.patch_all()
import boto3 # make sure you import after doing the monkey patch
def ec2_region(region_name):
instances = 0
result = 'succeeded'
ec2 = boto3.Session().resource('ec2', region_name=region_name)
try:
result_instances = sum(1 for _ in ec2.instances.all())
except:
result = 'failed'
return f'{region_name:20}\t{result:10}\t{instances}'
regions = boto3.session.Session().get_available_regions('ec2')
jobs = [spawn(ec2_region, region_name) for region_name in regions]
joinall(jobs)
print(*[job.value for job in jobs], sep='\n')
大约需要2-3秒。
如果没有gevent,例如:
import boto3
def ec2_region(region_name):
instances = 0
result = 'succeeded'
ec2 = boto3.Session().resource('ec2', region_name=region_name)
try:
result_instances = sum(1 for _ in ec2.instances.all())
except:
result = 'failed'
return f'{region_name:20}\t{result:10}\t{instances}'
regions = boto3.session.Session().get_available_regions('ec2')
jobs = [ec2_region(region_name) for region_name in regions]
print(*jobs, sep='\n')
大概需要17秒。
发布于 2018-12-04 03:28:48
只要botocore使用这些套接字调用,gevent猴子补丁就会自动修补底层的所有套接字调用。而且boto3确实使用了botocore。
https://stackoverflow.com/questions/40878996
复制相似问题