Boto3 no but you could monkey patch botocore.
In the top of your modules you would always need to monkey patch first and afterwards use botocore session, example:
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'))
UPDATE 03.04.2021
I just checked and verified that gevent monkey_patch method works with 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')
It takes around 2-3 seconds.
Without gevent, e.g.:
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')
takes around 17seconds.