Как получать сообщения из очереди с помощью multithread в Python

91
8

Я пишу код Python для приема сообщений из очереди FIFO Amazon SQS с многопоточным.

Ниже приведена функция получения сообщения. Имя потока должно быть распечатано с помощью 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, сообщения обрабатываются только из основного потока, а не из этих двух рабочих.

MainThread > {"cs_id": 1}
MainThread > {"cs_id": 2}
MainThread > {"cs_id": 3}
......
MainThread > {"cs_id": 17}
MainThread > {"cs_id": 18}
MainThread > {"cs_id": 19}

Что я упустил? Почему сообщения не принимаются дочерними потоками?

спросил(а) 2018-08-01T21:32:00+03:00 2 года, 2 месяца назад
0
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема