Python 2 进程在套接字上通信

Posted

技术标签:

【中文标题】Python 2 进程在套接字上通信【英文标题】:Python 2 process communicate on socket 【发布时间】:2012-01-05 08:05:11 【问题描述】:

我需要 2 个进程进行通信。两者都可以单独运行,但是当它们一起运行时,它们应该进行通信。它们每分钟只相互发送几个字节。两者都不被认为是“主机”或“客户端”。

我尝试创建一个在后台处理该问题的类。例如,它首先尝试连接到套接字,如果失败,它会尝试监听,等等。当一个程序终止时,另一个程序会接管监听,等等。在为此挣扎了太久之后,我放弃了。有太多的错误,我不能让它可靠地工作。

所以我想知道是否有一个好的替代解决方案,或者是否有我可以使用的这类东西的健壮实现。我没有时间再胡闹了。我需要它在 windows 和 linux 上工作。

【问题讨论】:

【参考方案1】:

使用0mq,带有两对 PUB/SUB 套接字。

【讨论】:

【参考方案2】:

如果您在使用套接字时遇到问题,您可能需要查看其他 IPC 机制。例如,named pipes 让两个进程进行通信,就好像它们只是在向文件写入/读取文件一样。

以下示例显示了如何创建命名管道以及如何在两个不同的进程中打开以进行读写:

import os

pipe_name = '/tmp/ipc'

if not os.path.exists(pipe_name):
    os.mkfifo(pipe_name)
    try:
        with open(pipe_name) as f:
            print 'Received:', f.read()
        with open(pipe_name, 'w') as f:
            message = 'Goodbye World!'
            print 'Sending:', message
            f.write(message)
    finally:
        os.remove(pipe_name)
else:
    with open(pipe_name, 'w') as f:
        message = 'Hello World!'
        print 'Sending:', message
        f.write(message)
    with open(pipe_name) as f:
        print 'Received:', f.read()

第一个过程将:

创建命名管道 接收消息 发送另一条消息 删除管道

而第二个过程将只是:

发送消息 收到另一条消息

如果您在两个不同的终端中执行上面的示例,您将在第一个终端中得到:

Received: Hello World!
Sending: Goodbye World!

在第二个中:

Sending: Hello World!
Received: Goodbye World!

注意:这只是一个例子。如果您需要双向通信,则使用两个命名管道会更方便,而不是在需要接收/发送消息时只打开一个用于读取/写入。

【讨论】:

以上是关于Python 2 进程在套接字上通信的主要内容,如果未能解决你的问题,请参考以下文章

学习Python基础--------7网络编程

python成长之路第九篇:网络编程

Linux-进程间通信: 域套接字

资深程序员:深入Python进程间通信原理!

Python网络编程

python全栈脱产第37天------进程池与线程池协程gevent模块单线程下实现并发的套接字通信