为什么自定义编译的 Python 3.5 应用程序在等待 Web Socket 消息时崩溃,但安装了 apt-get Python 3.4 却没有

Why custom compiled Python 3.5 app crashes when waiting for Web Socket message, but apt-get installed Python 3.4 does not

我 运行 在自编译 Python 3.5.2 上的应用程序 运行 中遇到异常,我无法解释。 There's a web socket handler on the server side 除了获取传入连接然后等待网络套接字本身的输入外,它什么都不做:

request = ...
wsock = aiohttp.web.WebSocketResponse()
yield from wsock.prepare(request)
msg = yield from wsock.receive_json()  # throws TypeError

正在抛出的异常:

TypeError('Received message 258:AttributeError("\'_UnixSelectorEventLoop\' object has no attribute \'create_future\'",) is not WSMsgType.TEXT',)

在堆栈跟踪的每次调用中,我都没有发现任何抛出此错误的行。当 运行 与预构建的 Python 3.4 相同的代码时,web 套接字服务器工作正常。我们使用 OpenEmbedded 预配置的 Python 3.5.2,因为我们正在构建自己的 Linux.

(Pdb) w
  /srv/homeassistant/venv/bin/hass(11)<module>()
-> sys.exit(main())
  /srv/homeassistant/venv/lib/python3.5/site-packages/homeassistant/__main__.py(396)main()
-> exit_code = setup_and_run_hass(config_dir, args)
  /srv/homeassistant/venv/lib/python3.5/site-packages/homeassistant/__main__.py(325)setup_and_run_hass()
-> return hass.start()
  /srv/homeassistant/venv/lib/python3.5/site-packages/homeassistant/core.py(144)start()
-> self.loop.run_forever()
  /srv/homeassistant/venv/lib/python3.5/site-packages/asyncio/base_events.py(276)run_forever()
-> self._run_once()
  /srv/homeassistant/venv/lib/python3.5/site-packages/asyncio/base_events.py(1172)_run_once()
-> handle._run()
  /srv/homeassistant/venv/lib/python3.5/site-packages/asyncio/events.py(120)_run()
-> self._callback(*self._args)
  /srv/homeassistant/venv/lib/python3.5/site-packages/asyncio/tasks.py(292)_wakeup()
-> self._step(value, None)
  /srv/homeassistant/venv/lib/python3.5/site-packages/asyncio/tasks.py(236)_step()
-> result = coro.send(value)
  /srv/homeassistant/venv/lib/python3.5/site-packages/aiohttp/web_protocol.py(417)start()
-> resp = yield from self._request_handler(request)
  /srv/homeassistant/venv/lib/python3.5/site-packages/aiohttp/web.py(289)_handle()
-> resp = yield from handler(request)
  /srv/homeassistant/venv/lib/python3.5/site-packages/asyncio/coroutines.py(143)coro()
-> res = yield from res
  /srv/homeassistant/venv/lib/python3.5/site-packages/asyncio/coroutines.py(143)coro()
-> res = yield from res
  /srv/homeassistant/venv/lib/python3.5/site-packages/homeassistant/components/http/ban.py(58)ban_middleware_handler()
-> return (yield from handler(request))
  /srv/homeassistant/venv/lib/python3.5/site-packages/homeassistant/components/http/__init__.py(425)handle()
-> result = yield from result
  /srv/homeassistant/venv/lib/python3.5/site-packages/asyncio/coroutines.py(143)coro()
-> res = yield from res
> /srv/homeassistant/venv/lib/python3.5/site-packages/homeassistant/components/websocket_api.py(322)handle()

所以我猜测是我们自己编译的Python3.5.2有问题。那会是什么?

Web 套接字服务器应用程序正在使用通过 pip 安装的最新 asyncio 版本 3.4.3。然而,该库似乎与 Python 3.5.2 的用法冲突。 Python 3.5.2 应该有它自己的 asyncio,它已经在 pypi 上可用的版本上发展了。这就是说,提供适当的 asyncio 库以及 Python 3.5.2 已经解决了这个问题。