首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >boto3是否支持greenlets?

boto3是否支持greenlets?
EN

Stack Overflow用户
提问于 2016-11-30 09:57:29
回答 2查看 1.5K关注 0票数 1

我在谷歌上快速搜索了一下,找不到任何明确的说法。基本上,我正在尝试从SQS读取事件并处理它们,而asio预计将由greenlet处理。

那么在greenlet中可以使用的boto3的粒度是多少呢?每个greenlet是否需要会话/客户端?我需要额外的互斥量吗?

EN

回答 2

Stack Overflow用户

发布于 2017-10-31 20:13:35

Boto3没有,但你可以用猴子补丁botocore。

在你的模块的顶部,你总是需要先用猴子补丁,然后再使用botocore会话,例如:

代码语言:javascript
运行
复制
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一起工作:

代码语言:javascript
运行
复制
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,例如:

代码语言:javascript
运行
复制
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秒。

票数 1
EN

Stack Overflow用户

发布于 2018-12-04 03:28:48

只要botocore使用这些套接字调用,gevent猴子补丁就会自动修补底层的所有套接字调用。而且boto3确实使用了botocore。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40878996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档