问题 Boto connect_xxx方法和连接池


如果我多次调用boto.connect_xxx,其中xxx是某个服务(dynamodb,s3等),它每次都会创建一个新的连接池吗?我想做的是这样的事情(Flask中的例子):

@app.before_request
def before_request():
    g.db = connect_dynamodb()

确保我始终连接,但我不希望在每次请求之前执行此操作,如果它每次都会创建新的安全令牌等,整个rigamarole。在应用程序启动时只调用connect_xxx()一次是否安全,并依赖boto根据需要生成新连接等等?


1427
2017-07-24 00:36


起源



答案:


最好的方法是在应用程序启动时调用connect_xxx方法一次,然后依靠boto来管理连接。该规则的唯一例外是您使用多个线程。在这种情况下,每个线程应该创建它自己的连接,因为boto使用的httplib不是线程安全的。

即使你在每次请求之前调用connect_xxx方法,你也应该没问题。 Boto池级别的连接,应该以非常有效的方式处理它。


11
2017-07-24 02:36



感谢你的回答!感谢boto本身,没有它我就活不下去。你提到的线程提出了另一个基本相同主题的问题, 这里。 - Caleb Wright
是否有可用于此信息的文档参考? - Michael Waterfall
该 connect_xxx 方法返回子类的实例 AWSAuthConnection 这确实是线程安全的。您应该每个进程(和连接参数)只执行一次 - 而不是在每个线程中。连接池未存储在类级别。 - malthe
@malthe有任何提及指向那个(AWSAuthConnection 是线程安全的)? - Tuukka Mustonen
@TuukkaMustonen自此 这个补丁 连接对象使用池,使得每个连接一次仅由单个线程使用。 - malthe


答案:


最好的方法是在应用程序启动时调用connect_xxx方法一次,然后依靠boto来管理连接。该规则的唯一例外是您使用多个线程。在这种情况下,每个线程应该创建它自己的连接,因为boto使用的httplib不是线程安全的。

即使你在每次请求之前调用connect_xxx方法,你也应该没问题。 Boto池级别的连接,应该以非常有效的方式处理它。


11
2017-07-24 02:36



感谢你的回答!感谢boto本身,没有它我就活不下去。你提到的线程提出了另一个基本相同主题的问题, 这里。 - Caleb Wright
是否有可用于此信息的文档参考? - Michael Waterfall
该 connect_xxx 方法返回子类的实例 AWSAuthConnection 这确实是线程安全的。您应该每个进程(和连接参数)只执行一次 - 而不是在每个线程中。连接池未存储在类级别。 - malthe
@malthe有任何提及指向那个(AWSAuthConnection 是线程安全的)? - Tuukka Mustonen
@TuukkaMustonen自此 这个补丁 连接对象使用池,使得每个连接一次仅由单个线程使用。 - malthe