如何在Python中使用多线程从队列接收消息

时间:2018-08-01 18:32:42

标签: python multithreading message-queue amazon-sqs

我正在编写Python代码以通过多线程接收来自Amazon SQS FIFO队列的消息。

下面是接收消息的功能。该线程的名称应该用int

打印出来
threading.currentThread().getName()

我试图用两个线程来运行它:

def consume_msgs():
    sqs = boto3.client('sqs',
                   region_name='us-east-1',
                   aws_access_key_id=AWS_ACCESS_KEY_ID,
                   aws_secret_access_key=AWS_SECRET_ACCESS_KEY)
    print('STARTING WORKER listening on {}'.format(QUEUE_URL))
    while 1:
        response = sqs.receive_message(
            QueueUrl=QUEUE_URL,
            MaxNumberOfMessages=1,
            WaitTimeSeconds=10,
        )
        messages = response.get('Messages', [])
        for message in messages:
            try:
                print('{} > {}'.format(threading.currentThread().getName(), message.get('Body')))
                body = json.loads(message.get('Body'))
                sqs.delete_message(QueueUrl=QUEUE_URL, ReceiptHandle=message.get('ReceiptHandle'))

            except Exception as e:
                print('Exception in worker > ', e)
                sqs.delete_message(QueueUrl=QUEUE_URL, ReceiptHandle=message.get('ReceiptHandle'))

    time.sleep(10)

当我在def process_msgs(): for i in range(2): t = threading.Thread(target=consume_msgs(), name='worker-%s' % i) t.setDaemon(True) t.start() while True: print('Waiting') time.sleep(5) 中运行process_msgs()时,仅从主线程而不是这两个工作线程处理消息。

main

我想念什么?为什么子线程未收到消息?

0 个答案:

没有答案