RabbitMQ pika. Как побороть StreamLostError?
Использую библиотеку pika для взаимодействия с RabbitMQ очередями
Для создания соединения использую:
def get_connection():
credential = pika.PlainCredentials(LOGIN, PASS)
parameters = pika.ConnectionParameters(
HOST,
5672,
'/',
credential,
heartbeat=0,
blocked_connection_timeout=0
)
connection = pika.BlockingConnection(parameters)
return connection
Далее:
channel = get_connection().channel()
channel.basic_consume(queue='test', on_message_callback=run)
channel.start_consuming()
Функция run выполняет долгие вычисления (около 30 минут) и по завершении работы функции я вызываю ch.basic_ack(method.delivery_tag), но получаю ошибку
StreamLostError: Stream connection lost: ConnectionResetError(104, 'Connection reset by peer')
Не понимаю, что нужно сделать, чтобы подождать выполнение всей функции или вообще отключить таймаут
P.S. пробовал задавать различные значения для параметров heartbeat и blocked_connection_timeout, но результатов это не дало. Если ставлю значение обоих параметров 7200, то всего равно получаю эту ошибку после получаса работы кода
Ответы (1 шт):
30 минут это много для tcp соединения. Вам бы переработать код. При синхронных вычислениях переведите тело колбэка в тред и выходите из колбэка. Тогда пика сможет посылать сердцебиения. ch передайте в тред и выполните аск из треда.
Для обработки в процессах нужно бы очередь сделать, но на пика не помню как вклиниться в главный цикл.