这个问题已经困扰了我几天了。我通过打开多个线程使用 RabbitMQ 运行多个使用者,但出现以下错误。
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 905, in queue_declare
None, replies)
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 1141, in _rpc
self._wait_on_response(method_frame))
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 1162, in _send_method
self.connection.process_data_events()
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 240, in process_data_events
if self._handle_read():
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 347, in _handle_read
if self._read_poller.ready():
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 43, in inner
return f(*args, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pika/adapters/blocking_connection.py", line 85, in ready
events = self.poller.poll(self.poll_timeout)
RuntimeError: concurrent poll() invocation
Run Code Online (Sandbox Code Playgroud)
许多谷歌搜索使我找到了问题 8865,它描述了如何不能同时调用 select.poll() 函数。并且此错误可以由以下脚本一致触发:
import os
import select
import threading
import time
p = select.poll()
rfds = []
r, w = os.pipe()
for i in range(1000):
fd = os.dup(r)
rfds.append(fd)
p.register(fd, select.POLLIN)
def resize_ufds_array():
time.sleep(0.5)
# trigger ufds array reallocation
for fd in rfds:
p.unregister(fd)
p.register(w, select.POLLOUT)
p.poll()
# and make the call to poll() from the main thread return
os.write(w, b'hello')
t = threading.Thread(target=resize_ufds_array)
t.start()
p.poll()
Run Code Online (Sandbox Code Playgroud)
我发现此脚本无法触发从 Window MSI 安装的本地 Python 2.7.8 上的错误,因为 select.poll 已删除。但是,在我的 prod 环境中,它是 Ubuntu 14.04,我尝试从源代码安装 Python 2.7.6-2.7.9,它们都有这个错误。知道如何在 Ubuntu 上解决这个问题吗?此处有针对 2.7 版本的此问题的 python 修复程序但不知何故在我应用补丁后,脚本仍然显示错误。