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 шт):

Автор решения: eri

30 минут это много для tcp соединения. Вам бы переработать код. При синхронных вычислениях переведите тело колбэка в тред и выходите из колбэка. Тогда пика сможет посылать сердцебиения. ch передайте в тред и выполните аск из треда.

Для обработки в процессах нужно бы очередь сделать, но на пика не помню как вклиниться в главный цикл.

→ Ссылка