2015-11-01 60 views
6

在Python中使用botocore庫進行AWS-EC2的自動化操作時,我注意到許多HTTPS連接仍在建立中,這些連接不再需要忙於進行的進程其他的東西(如此殺死它們或將它們重新編碼退出並不是一種選擇)。我認爲botocore會話和/或客戶端對象正在離開建立的AWS端點的連接。 botocore文檔顯示如何啓動或創建它們,但不是如何關閉它們或清理乾淨。我嘗試了一個.close方法,但它不存在。 如何在不殺死進程的情況下正常關閉這些連接?botocore:如何關閉或清理會話或客戶端

回答

2

我有同樣的問題,但是從稍微不同的角度:當關閉工作線程,我的日誌文件會得到堆滿了這些警告 - 也因開連接:

異常在忽略:< ssl.SSLSocket fd = 4,family = AddressFamily.AF_INET,type = 2049,proto = 6,laddr =('[internal ip]',49266),raddr =('[external ip]',443)>

ResourceWarning:unclosed < ssl.SSLSocket fd = 4,family = AddressFamily.AF_INET,type = 2049,proto = 6,laddr =('[internal ip]',49266),raddr =('[external ip]',443)>

經過一段時間的兔子洞之後,我已經想出瞭如何在關閉線程之前正確關閉連接。

我在boto3中使用SQS,因此您可能需要修改調用以使其與botocore協同工作。

我的實施例產生上述警告是:用

import boto3 
import boto3.session 
import warnings 

warnings.simplefilter('error', ResourceWarning) # Display warnings 
session = boto3.session.Session() 
sqs = session.resource('sqs', region_name=AWSregion) 
sqs_q = sqs.Queue(url=SQSQueueUrl) 
sqs_msg = sqs_q.receive_messages(MaxNumberOfMessages=1) 

的SQS連接可以被關閉:

sqs.meta.client._endpoint.http_session.close() # closing a boto3 resource 
sqs._endpoint.http_session.close() # closing a boto3 client