【问题标题】:Local machine interprocess communication with multiple independent processes (1 server, n clients)本地机器与多个独立进程(1个服务器,n个客户端)的进程间通信
【发布时间】:2018-12-14 12:35:08
【问题描述】:

我想要一个接受简单消息的服务器进程(最好是 Python)和连接到服务器并向其发送消息的多个客户端(同样,最好是 Python)。服务器和客户端只会在同一台本地机器上运行,并且操作系统是基于 Linux 的。服务器将由操作系统自动启动,客户端随后独立于服务器启动。我强烈希望避免安装一个完全独立的消息传递框架/服务器来执行此操作。消息将是简单的字符串,例如“kick”,甚至只是表示消息类型的单个字节。它还需要知道何时建立和断开连接。

根据这些要求,我认为命名管道将是一个可行的解决方案,为每个客户端连接创建一个该管道的新实例。但是,当我搜索示例时,我遇到的所有示例都处理从同一个父进程产生的进程并且不是独立启动的,这意味着它们可以将父引用传递给子进程。

Windows 似乎允许命名管道的多个实例(每个客户端连接一个),但我不确定这在基于 Linux 的操作系统上是否可行?

请有人指出我正确的方向,最好是一个基本的例子,即使它只是伪代码。

我查看了 Python 中的多处理模块,但这似乎是围绕服务器和客户端共享同一个进程或一个生成另一个进程。

编辑 可能很重要,不保证主机设备具有网络功能(嵌入式设备)。

【问题讨论】:

    标签: python linux pipe ipc


    【解决方案1】:

    我以前用过zeromq 来处理这类事情。它是一个相对轻量级的库,公开了此类功能

    否则,您可以通过bind在服务器进程中创建一个套接字并让客户端connect 来实现它。这适用于 unix 域套接字,只需在创建套接字时传递 AF_UNIX,例如:

    import socket
    
    with socket.socket(socket.AF_UNIX) as s:
        s.bind('/tmp/srv')
        s.listen(1)
    
        (c, addr) = s.accept()
        with c:
            c.send(b"hello world")
    

    对于服务器,并且:

    with socket.socket(socket.AF_UNIX) as c:
        c.connect('/tmp/srv')
        print(c.recv(8192))
    

    为客户。

    围绕这个编写协议涉及更多,这就是像 zmq 这样的东西真正帮助您轻松推送 JSON 消息的地方

    【讨论】:

    • 谢谢。我再看看那个图书馆。您知道套接字方法是否适用于没有任何物理网络适配器的机器?
    • 是的,应该没问题。如果您没有物理接口,即使 localhost 也应该可以工作
    • 更具体地说,域套接字应该只取决于内核是否编译了网络支持,localhost 依赖于正在配置的“环回”设备。通用分布确保默认情况下两者都发生
    • 您的示例可能是最简单的解决方案,因为我将发送的消息非常基本。我喜欢它不需要端口号这一事实。
    • zeromq 支持 unix 域套接字以及提供各种其他不错的功能......
    猜你喜欢
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    相关资源
    最近更新 更多