异步双向RPC

时间:2011-09-03 12:07:35

标签: python rpc

我正在寻找使用TCP的Java或Python(首选Python)的RPC库。它应该支持:

  • 异步
  • 双向
  • RPC
  • 某种事件循环(带回调或类似)

有什么建议吗?我看过像bjsonrpc这样的东西似乎是正确的东西,但服务器似乎无法识别哪些连接;因此,如果用户已经识别他/她并且来自另一个用户的请求来向该用户发送消息,则它不会公开该用户连接,因此我们可以发送该消息。

4 个答案:

答案 0 :(得分:6)

你一定要看看Twisted。它是一个基于事件的Python网络框架,具有支持select,poll,epoll,kqueue和I / O完成端口的事件循环(称为“reactor”)的实现,并使用名为Deferreds的对象调解异步调用。

至于你的RPC要求,也许你应该查看Twisted的PB库或AMP

答案 1 :(得分:2)

我不完全确定你的意思是“事件循环”,但你应该看看RPyC(Python)

RPyC Project page

答案 2 :(得分:1)

我是bjsonrpc的作者。我相信你可以用它做你想做的事。

有些事情可能记录不清,或者可能需要一些例子。

但是,简而言之,处理程序可以存储内部状态(如是否经过身份验证,或者可能是用户名)。从任何处理程序,您都可以访问“连接”类,该类具有套接字本身。

似乎你想要像聊天这样的东西。我过去做过类似的事。我将尝试为新版本添加聊天示例。

此处解释了内部状态: http://packages.python.org/bjsonrpc/tutorial1/index.html#stateful-server

它们应该用于身份验证(但是还没有提供标准的auth方法)。

关于如何从处理程序到达连接类,尚未记录(抱歉),但有时在源代码中的示例中使用它。例如,example1-server.py包含此公共函数:

def gettotal(self):
    self._conn.notify.notify("total")
    return self.value_total

BaseHandler._conn表示该用户的连接。并且与您连接时完全相同:

conn = bjsonrpc.connect(host=host,port=port,handler_factory=MyHandler)

因此,您可以将已记录用户的连接存储在全局变量中,然后调用您想要的任何客户端方法。

答案 3 :(得分:1)

我参与了开发Versile Python(VPy),它提供了您要求的功能。它目前可用作主要用于测试的开发版本,但您可能需要查看它。

关于识别用户,您可以配置远程方法以接收上下文对象,该方法使该方法能够使用与此草案代码类似的语法接收有关经过身份验证的用户的信息。

from versile.quick import *

@doc
class MessageBox(VExternal):
    """Dispatches IM messages."""
    @publish(show=True, doc=True, ctx=True)
    def send_message(self, msg, ctx=None):
        """Sends a message to the message box"""
        if ctx.identity is None:
            raise VException('No authenticated user')
        else:
            # do something ...
            pass