Problem:中的.so(共享对象)库在python调用它时运行良好,并且在uWSGI运行的python(Django)应用程序中失败。
更多信息:我用go build -buildmode=c-shared -o output.so input.go构建了Go模块,以便在Python中调用它
from ctypes import cdll
lib = cdll.LoadLibrary('path_to_library/output.so')当django项目通过uWSGI服务时,调用Go库的请求处理程序将冻结,从而导致Nginx中的未来504。进入“冻结”后,uWSGI被锁定在那里,只有重新启动才有助于激活应用程序。根本没有日志!只是结冰了。
当我在同一台机器上运行python解释器时,所有东西都能正常工作。
我的想法是:我试着调试这个程序,并将大量日志消息放入库中,但是它不会给出太多的信息,因为库中的一切都很好(因为它在解释器中工作)。库正确加载,因为我在库中输入了一些日志消息。我认为这是某种uWSGI的限制。我不认为放置uwsgi.ini文件是有帮助的。
更多信息:
- `fmt`
- [`github.com/360EntSecGroup-Skylar/excelize`](https://github.com/360EntSecGroup-Skylar/excelize)
- `log`
- `encoding/json`
在这种类型的共享对象工作中,uWSGI可以有哪些限制,如果有方法来克服它们呢?
发布于 2018-02-21 20:41:08
尝试与思考
我试图避免共享库与我的python代码分离,因为它至少需要一个进程的支持,我需要重写一些库来创建新的api。
正如@Lu.nemec善意地指出的那样:
Go有自己的运行时、线程管理,并且可能无法很好地处理以不同方式处理线程/进程的uWSGI。
由于uWSGI是问题所在,我开始在那里寻找解决方案。其中一个希望是通过安装GCCGO uWSGI插件来解决这个问题。但是即使是在旧的OSes上也很难安装,因为它缺乏预构建插件,手工构建也不太好,没有帮助,没有任何改变,它仍然结冰。
然后我想,我不想禁用协同机制,与uWSGI不同的是,我能够做的改变之一就是设置GOMAXPROCS
GOMAXPROCS设置可以同时执行并返回前一设置的CPU的最大数量。如果n<1时,则不更改当前设置。本地机器上的逻辑CPU数可以用NumCPU查询。当调度程序改进时,此调用将消失。
就像一种魅力!
解决方案
import (
...
"runtime"
)
...
//export yourFunc
func yourFunc(yourArgs argType) {
runtime.GOMAXPROCS(1)
...
}发布于 2018-02-12 19:51:16
首先,您是否肯定需要调用Go作为uWSGI进程的库?
uWSGI通常用于解释语言,如PHP、Python和其他语言。它引导解释器并管理主/工作进程以处理请求。在Go库上使用它似乎很奇怪。
您提到了将nginx作为您的why服务器,为什么不直接使用您的Go程序作为http服务器(这很好)并直接使用它的URL从nginx调用它:
location /name/ {
proxy_pass http://127.0.0.1/go_url/;
}如果您真的希望使用Go作为通过.so模块导入的python库,您必须知道Go有它自己的运行时、线程管理,并且可能无法很好地处理以不同方式处理线程/进程的uWSGI。在这种情况下,我无法帮助你,因为我从来没有尝试过这个。
如果你能用你真正想做的事情来澄清你的问题,我们也许能更有帮助地回答。
发布于 2018-03-04 10:34:04
在某些情况下,我的先前的回答可以工作。但是,当我试图使用相同的操作系统、相同的Python、相同的uWSGI (版本、插件、配置文件)、相同的要求、相同的.so文件在另一个服务器上运行同一个项目时,它冻结了我在答复中描述的保存方式。
我个人不希望将其作为单独的进程运行,并将其绑定到套接字/端口,并创建用于与共享库通信的API。
解决办法:
只需要单独的进程。使用celery运行。
一些注意事项:
1.您不能使用task.apply()运行任务,因为它将在主应用程序中运行,而不是在celery中运行。
result = task.apply_async()
while result.ready():
time.wait(5)2.您需要使用celery执行池运行solo
celery -A app worker -P solohttps://stackoverflow.com/questions/48753818
复制相似问题