Python &引用;TypeError:堆参数必须是列表;在RabbitMQ pika阻塞连接上调用process_data_events()时

Python &引用;TypeError:堆参数必须是列表;在RabbitMQ pika阻塞连接上调用process_data_events()时,python,rabbitmq,pika,Python,Rabbitmq,Pika,在发布消息之前,代码检查RabbitMQ连接是否在执行实际发布之前关闭(请参阅下面的调用代码)。然而,当检查完成时,似乎出现了一些奇怪的类型错误 进一步详情: 异步使用者(即使用select连接pika.SelectConnection)侦听特定队列 当消费者处理一条消息时,它将通过非异步生产者将其他消息发布到另一个队列(即使用阻塞连接pika.BlockingConnection) 使用者和生产者是独立的代码段,但位于同一代码库中,并在同一服务器上的同一进程(和线程)中运行。为了更好地进行代

在发布消息之前,代码检查RabbitMQ连接是否在执行实际发布之前关闭(请参阅下面的调用代码)。然而,当检查完成时,似乎出现了一些奇怪的类型错误

进一步详情:

  • 异步使用者(即使用select连接
    pika.SelectConnection
    )侦听特定队列
  • 当消费者处理一条消息时,它将通过非异步生产者将其他消息发布到另一个队列(即使用阻塞连接
    pika.BlockingConnection
  • 使用者和生产者是独立的代码段,但位于同一代码库中,并在同一服务器上的同一进程(和线程)中运行。为了更好地进行代码解耦,将它们分开
  • 之所以只有使用者是异步的,是因为调用
    rmq\u consumer\u connection.ioloop.start()
    是一种阻塞操作(因此无法执行等效的
    rmq\u producer\u connection.ioloop.start()
    )。我可以考虑优化(例如,使用单独的线程,为消费者和生产者,所以两者都可以异步)。
  • 使用pika 0.12.0、RabbitMQ 3.7.8和Python 3.5
Stacktrace如下所示:

Apr 05 19:25:16 prod python[23326]:作业|回调|用户|队列|错误|回调|用户|队列中出现异常(..)
Apr 05 19:25:16 prod python[23326]:回溯(最近一次调用last):
Apr 05 19:25:16 prod python[23326]:文件“/opt/app/gateway\u messenger.py”,第282行,在发送到网关中
Apr 05 19:25:16 prod python[23326]:gv.rmq\u producer\u connection.process\u data\u events()
Apr 05 19:25:16 prod python[23326]:文件“/home/prod/anaconda3/envs/venv/lib/python3.5/site packages/pika/adapters/blocking_connection.py”,第751行,进程中的数据事件
Apr 05 19:25:16 prod python[23326]:使用_IoloopTimerContext(time_limit,self._impl)作为计时器:
Apr 05 19:25:16 prod python[23326]:文件“/home/prod/anaconda3/envs/venv/lib/python3.5/site packages/pika/adapters/blocking_connection.py”,第188行,输入__
Apr 05 19:25:16 prod python[23326]:self.\u回调\u结果.signal\u一次)
Apr 05 19:25:16 prod python[23326]:文件“/home/prod/anaconda3/envs/venv/lib/python3.5/site packages/pika/adapters/base_connection.py”,第112行,在add_timeout中
Apr 05 19:25:16 prod python[23326]:返回self.ioloop.add\u超时(截止日期,回调\u方法)
Apr 05 19:25:16 prod python[23326]:文件“/home/prod/anaconda3/envs/venv/lib/python3.5/site packages/pika/adapters/select_connection.py”,第364行,在add_timeout中
Apr 05 19:25:16 prod python[23326]:返回self.\u计时器。稍后调用(截止日期,回调\u方法)
Apr 05 19:25:16 prod python[23326]:文件“/home/prod/anaconda3/envs/venv/lib/python3.5/site packages/pika/adapters/select_connection.py”,第199行,稍后调用
Apr 05 19:25:16 prod python[23326]:heapq.heappush(self.\u timeout\u heap,timeout)
Apr 05 19:25:16 prod python[23326]:TypeError:堆参数必须是列表
呼叫代码如下:

def发送到网关(uid,数据):
…(非相关代码)。。。
尝试:

gv.rmq\u producer\u connection.process\u data\u events()您在这方面有什么进展吗?我在同样的情况下也看到了同样的问题。升级到pika 1.0.0并仔细检查我的代码的线程安全性有助于解决这个问题。但我不能确定确切的原因。