开源+分享一个自己做的基于 JSON-RPC over netlink socket 的跨进程通信库

2016-10-22 00:11:08 +08:00
 raysonx

语言: Python ,支持 Python 2.6 - 3.X

平台: Posix

特色:

  1. API 使用简单。
  2. 不用像 Unix domain socket 那样需要共享文件系统,只需要知道对方的 nlpid 就可以通信。而且多对多通信不需要为每个通信方创建 socket ,只需要一个就可以(类似于 UDP ,支持迭代服务器模型)。
  3. 可以跨 Linux 的 network namespaces ,只要你在调用 unshare 之前先创建好 netlink socket 就可以。
import unittest
import os
from procslink import RPCPeer


class HelloWorldTestCase(unittest.TestCase):
    def test_hello_world(self):
        pid = os.fork()
        if pid == 0:
            class MyAPI(object):
                def hello(self, name):
                    s = "Hello, %s!" % name
                    print(s)
                    return s
            rpc_server = RPCPeer()
            print("Server's nl_pid is %s." % rpc_server.nl_pid)
            rpc_server.register_functions_in_object(MyAPI())
            rpc_server.run_server_forever()
        else:
            rpc_client = RPCPeer()
            rpc_client.talk_to(pid).hello("Rayson Zhu")
            os.wait4(pid, 0)

GitHub 地址: https://github.com/vfreex/procslink

许可证: MIT

Pip 安装:

sudo pip install procslink
2209 次点击
所在节点    分享创造
5 条回复
raysonx
2016-10-22 00:13:04 +08:00
取自自己和朋友做的另一个项目的一个模块,可能还不太完善,但基本功能都有了。目前没有原生提供认证功能,使用时注意安全。
raysonx
2016-10-22 00:18:01 +08:00
README.md 中描述了通信协议的细节、目录结构和使用示例。
kongkongyzt
2016-10-22 01:21:48 +08:00
有个困惑,如果 rpc server 重启导致 nlpid 发生改变,那么 rpc client 也需要修改 nlpid ?
ldbC5uTBj11yaeh5
2016-10-22 01:28:22 +08:00
有点意思,和 erlang 的跨机通信接口像极了。顶一个。
raysonx
2016-10-22 13:12:39 +08:00
@kongkongyzt nlpid 可以自己指定,如果不指定的话,会由内核自动选择。如果一个进程只绑定一个 nlpid 的话, nlpid 等于进程 pid 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/314550

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX