2013-08-06 1 views
1

2 개의 다른 SQS 대기열을 사용하는 2 개의 다른 python 스크립트로 EC2에서 실행중인 상자가 있습니다. 지난 주 내 스크립트는 갑자기 모두 SQS 큐에서 메시지를 가져 오는 데 너무 오래 걸리는 경우에 매우 효과적이었습니다. 메시지를 가져 오는 경우에도 반복되는 많은 메시지를 가져옵니다.Python SQS boto 신뢰할 수 없거나 잘못 구현 되었습니까?

self.conn = SQSConnection(SQS_ACCESS_KEY, SQS_SECRET_KEY) 
    self.queue = self.conn.get_queue(queue_name) 

내 스크립트 (메서드은 getMessages 사용) 다음과 같은 방법 :

내이 스크립트는이 같은 방법을 사용하여 다음의 인스턴스는이 경우 self.queue에서

def getMessages(self, n): 
    '''returns n messages erasing them, mutliple of 10''' 
    msgs=[] 
    rs=self.queue.get_messages(10) 
    if len(rs) < 1: 
     return [] 
    count = 0 
    while count < n or len(rs) < 10: 
     msgs.extend(rs) 
     rs=self.queue.get_messages(10) 
     count += 10 
    # delete pulled messages 
    for msg in msgs: 
     self.queue.delete_message(msg) 

    return msgs 

입니다

while True: 
    print 'Getting SQS messages' 
    messages = sqs.getMessages(50) 
    print 'Got %s messages' % len(messages) 

    for msg in messages: 
     do_something(msg) 

    print 'Going to sleep' 
    time.sleep(sleep_time) 

이제 내 스크립트는 메시지를 가져 오는 데 너무 오래 걸리며 Getting SQS messages을 인쇄하고 몇 시간 동안 머물러 있습니다. 그것이 더 이상한 이유는 ipython 셸을 열고 getMessages(50)을 실행하면 매우 빠르게 실행되고 다른 스크립트는 똑같이 작동하지만 다른 큐에서 작동한다는 것과 그 문제는 전혀 없다는 것입니다.

무엇이 잘못되었을 수 있습니다, 감사합니다.

답변

3

당신은 while 루프에서 당신은 getMessages 기능에 몇 가지 버그가 있습니다
1. 사용을 count += len(rs)
2. 주요 버그 : SQS가 얻을 수 있기 때문에 당신이

or len(rs) < 10 

조건이 필요하지 않습니다 10 개의 메시지가 있고 큐가 꽉 차면 10 개의 메시지를받을 때마다 무한 루프가 발생합니다.

또한 메시지를 반환하기 위해 yield 문을 사용하는 것이 좋을 것이라고 생각합니다. 메시지를 처리 ​​한 후 처리 된 후에는 대기열에서 메시지를 제거해야합니다.