测试 nameko 基本示例时出现 BlockingIOError

BlockingIOError when testing the nameko basic example

在尝试有关 python 框架 nameko 的非常基本的示例时,我收到类似这样的错误:BlockingIOError: [WinError 10035] A non-blocking socket operation could not be completed immediately

知道它来自哪里吗?


我正在使用 python 3.7.0,最新版本的 nameko 和 rabbitMQ 3.7.10

这是我要测试的源代码 (!)

# helloworld.py

from nameko.rpc import rpc

class GreetingService:
    name = "greeting_service"

    @rpc
    def hello(self, name):
        return "Hello, {}!".format(name)

我们得到的错误是:

>>> n.rpc.greeting_service.hello(name="test")
===== 2019.01.17 08:01:18 =====
Traceback (most recent call last):
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\kombu\connection.py", line 414, in _reraise_as_library_errors
    yield
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\kombu\connection.py", line 494, in _ensured
    return fun(*args, **kwargs)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\kombu\messaging.py", line 203, in _publish
    mandatory=mandatory, immediate=immediate,
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\channel.py", line 1782, in basic_publish_confirm
    ret = self._basic_publish(*args, **kwargs)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\channel.py", line 1758, in _basic_publish
    self.connection.drain_events(timeout=0)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\connection.py", line 500, in drain_events
    while not self.blocking_read(timeout):
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\connection.py", line 505, in blocking_read
    frame = self.transport.read_frame()
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\transport.py", line 250, in read_frame
    frame_header = read(7, True)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\transport.py", line 430, in _read
    s = recv(n - len(rbuf))
BlockingIOError: [WinError 10035] A non-blocking socket operation could not be completed immediately

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<console>", line 1, in <module>
  File "c:\users\christianmoret\appdata\local\programs\python\python37\lib\site-packages\nameko\rpc.py", line 372, in __call__
    reply = self._call(*args, **kwargs)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\nameko\rpc.py", line 445, in _call
    extra_headers=extra_headers
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\nameko\amqp\publish.py", line 210, in publish
    **publish_kwargs
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\kombu\messaging.py", line 181, in publish
    exchange_name, declare,
  File "c:\users\christianmoret\appdata\local\programs\python\python37\lib\site-packages\kombu\connection.py", line 527, in _ensured
    errback and errback(exc, 0)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\contextlib.py", line 130, in __exit__
    self.gen.throw(type, value, traceback)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\kombu\connection.py", line 419, in _reraise_as_library_errors
    sys.exc_info()[2])
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\vine\five.py", line 194, in reraise
    raise value.with_traceback(tb)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\kombu\connection.py", line 414, in _reraise_as_library_errors
    yield
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\kombu\connection.py", line 494, in _ensured
    return fun(*args, **kwargs)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\kombu\messaging.py", line 203, in _publish
    mandatory=mandatory, immediate=immediate,
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\channel.py", line 1782, in basic_publish_confirm
    ret = self._basic_publish(*args, **kwargs)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\channel.py", line 1758, in _basic_publish
    self.connection.drain_events(timeout=0)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\connection.py", line 500, in drain_events
    while not self.blocking_read(timeout):
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\connection.py", line 505, in blocking_read
    frame = self.transport.read_frame()
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\transport.py", line 250, in read_frame
    frame_header = read(7, True)
  File "c:\users\xxx\appdata\local\programs\python\python37\lib\site-packages\amqp\transport.py", line 430, in _read
    s = recv(n - len(rbuf))
kombu.exceptions.OperationalError: [WinError 10035] A non-blocking socket operation could not be completed immediately
>>>

Kombu 最近提交要求 amqp>=2.4.0,<3.0。恢复到 amqp v2.3.2 可解决此问题。我建议使用 Kombu v4.2.1 而不是 v4.2.2.post1。