从非 uwsgi 进程与 uwsgi RPC 应用程序对话

Posted

技术标签:

【中文标题】从非 uwsgi 进程与 uwsgi RPC 应用程序对话【英文标题】:Talk to a uwsgi RPC app from a non uwsgi process 【发布时间】:2013-04-12 22:31:40 【问题描述】:

我们有一个正常工作的 uwsgi 服务器,带有一些 RPC 调用(注意:我们能够使用 uwsgi.rpc 与进程对话,因此它们的设置很好)。我们发现我们有一些未在 uwsgi 下运行的进程,我们想与 RPC 服务器通信。查看 uwsgi 源代码,看起来从不在 uwsgi 后面运行的 python 进程进行通信应该相对容易,但我们所能得到的是:

read(): Resource temporarily unavailable [proto/uwsgi.c line 75]
Fri Apr 12 15:21:07 2013 - error parsing request

这是我们正在使用的代码。我认为它正确地打包了数据,但我不确定为什么它不起作用:

import socket
from struct import pack

c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
c.connect(('127.0.0.1', 3035))

fun = 'test_fun'
arg = 'hi'
ulen = len(fun)
arglen = len(arg)
buflen = (2 + ulen) + (2 + arglen)
buf = pack('!B', 173)
buf += pack('!H', buflen)
buf += pack('!B', 0)
buf += pack('!B', ulen & 0xff)
buf += pack('!B', (ulen>>8) & 0xff)
buf += fun
buf += pack('!B', arglen & 0xff)
buf += pack('!B', (arglen>>8) & 0xff)
buf += arg

sent = c.send(buf)
c.close()

【问题讨论】:

有什么理由不只是使用 uwsgi 库? projects.unbit.it/uwsgi/wiki/RPC 我们到处都在使用消费者。看起来我们可以使用 uwsgi,但我们必须添加一些插件(github.com/unbit/uwsgi/issues/29),而我们唯一需要 uwsgi 的就是发送 RPC 请求,所以看起来有点过头了。 【参考方案1】:

您需要将标头与正文分开发送,并且您的函数+参数的长度需要是小端。

fun = 'test_fun'                                                     
arg = 'hi'                                                                          
ulen = len(fun)                                                                    
arglen = len(arg)                                                                  
buflen = (2 + ulen) + (2 + arglen)                                                 
buf = pack('!B', 173)                                                              
buf += pack('<H', buflen)                                                          
buf += pack('!B', 0)                                                               
c.send(buf)                                     

buf = pack('!B', ulen & 0xff)                                                      
buf += pack('!B', (ulen>>8) & 0xff)                                                
buf += fun                                                                         
buf += pack('!B', arglen & 0xff)                                                   
buf += pack('!B', (arglen>>8) & 0xff)                                              
buf += arg                                                                         
sent = c.send(buf)                                                                 
print "sent", sent

【讨论】:

以上是关于从非 uwsgi 进程与 uwsgi RPC 应用程序对话的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu18部署uwsgi+flask应用

通过 Nginx 的 uwsgi + django - uwsgi 设置/生成?

烧瓶(uwsgi)应用程序上的守护进程后台任务

响应速度与uwsgi线程数的关系

Ubuntu+Nginx+uWSGI+Flask应用

WSGI与uWSGI的应用场景与使用方法