【发布时间】:2016-03-24 22:29:38
【问题描述】:
我安装了一个以皇帝模式运行的 uWSGI。 Vassal 使用不同的 Python 版本,所以我不能在 uWSGI 二进制文件中嵌入 Python 插件。
话虽如此,我想在其中一个 vassal 中使用 asyncio 循环引擎,但我不知道如何运行未嵌入的 asyncio 插件和 greenlet 插件。
到目前为止我所做的尝试:
-
将 asyncio 和 greenlet 嵌入到 uWSGI 中,使用:
CFLAGS="-I/usr/local/include/python3.4" make PYTHON=python3.4 asyncio构建uWSGI。但这也会嵌入 python 插件,我不想要它。
-
使用以下方法构建 asyncio 和 uWSGI 作为外部插件:
PYTHON=python3.4 ./uwsgi --build-plugin "plugins/greenlet greenlet" PYTHON=python3.4 ./uwsgi --build-plugin "plugins/greenlet greenlet"构建插件,但插件将无法加载:
/usr/local/lib/uwsgi/asyncio_plugin.so:未定义符号:up
/usr/local/lib/uwsgi/greenlet_plugin.so:未定义符号:向上在日志中。
// 编辑
我发现python插件必须在设置中的asyncio和greenlet之前启用,所以错误不再发生,但greenlet不起作用,当前greenlet中没有父级。
我还能尝试做什么?我敢打赌,在 python3.4 插件中嵌入 asyncio 和 greenlet 会起作用,但我不知道该怎么做,甚至不知道是否可行。
目前我正在使用带有内置必需插件的第二个皇帝,但由于平台限制,我不能再使用该解决方案了。
【问题讨论】:
-
我不明白你为什么在 synchronous uWSGI 中需要 asynchronous asyncio?
-
@AndrewSvetlov uWSGI 不仅是同步的。这可能会令人困惑,但 uWSGI 也可以处理异步应用程序,请参阅 this example in docs。我需要用于 websockets 的异步 uWSGI 服务器,就像在这种情况下一样,但我还需要来自 asyncio 的一些功能(主要是第三方库)(示例基于 gevent)。
-
你也可以运行一个额外的 Emperor,并让他们监控不同的目录 - 我们这样做是为了在 Emperor 下运行 CPython 和 PyPy 应用程序,它们也是不兼容的。
-
@KonstantinLopuhin 实际上,您可以使用 uwsgi 二进制文件在一个皇帝中处理 CPython 和 PyPy,而无需内置 python 插件。这样一个vassal 就可以使用PyPy 插件和其他CPython。我的目标是使用 asyncio 实现这种行为,但还没有成功......
-
我在 Python+cffi 中成功重写了 pypy 插件和 asyncio 事件循环,减去了一些细节。 github.com/unbit/uwsgi/pull/2170
标签: python-3.x uwsgi python-asyncio greenlets