一个 python 进程为另一个 python 进程提供信息

Posted

技术标签:

【中文标题】一个 python 进程为另一个 python 进程提供信息【英文标题】:One python process providing information for another python process 【发布时间】:2015-04-09 10:45:33 【问题描述】:

我知道类似的问题偶尔会出现

communication between 2 programs in python 或者 Communication between two python scripts

但我的问题要简单得多。我有两个 python 进程在同一台计算机上连续运行,从属进程偶尔需要来自主进程的三个浮点数。

我不是编程专家,我会在计算机内存的某个位置保留三个浮点槽,它们会被主进程不断更新,而从进程在需要信息时会简单地读取这些内存槽。所以本质上 master 一直在说话,slave 只在需要信息时才监听。

这是否可以不费吹灰之力就做到?如果可能,请保持简单的答案,因为我不是编程专家。

【问题讨论】:

你考虑过使用套接字在两个进程之间进行通信吗? @JamesKent 我没有,你能为初学者提供一些好的链接吗? (我遇到过它,但它似乎连接到互联网通信而不是计算机间通信。) tutorialspoint.com/python/python_networking.htm 是套接字编程的合理资源,一般来说,您通常会在机器之间或通过 Internet 使用它,但它可以很容易地用于进程间通信,特别是如果有托管端口的专用主进程,其他进程连接到端口,根据您选择使用的 IP/端口,您可以进行一对一、一对多(使用单独的数据流)和一对多(相同通过多播向所有侦听器发送数据),这一切都取决于您想要实现的目标。 【参考方案1】:

这取决于您不是编程专家的水平、您需要多快更新这些数字以及您使用的操作系统。

话虽如此,“简单”的方法就是将它们写入一个(或多个)从属进程监控变化的文件,并在它们更新时读取。

【讨论】:

如果可能的话,它应该是独立于操作系统的,但目前我正在为 Windows 开发它。关于磁盘文件的想法我也想到了,但是由于更新应该在 0.1 秒的范围内,我宁愿避免硬盘干扰以提高速度和可靠性。 @Pygmalion:100ms 在任何平台上对于文件系统来说都是微不足道的。该文件在写入时将由任何现代操作系统的 VFS 层缓存在内存中(“现代”是指“在过去 10 年中编写的”),并且将正确设置更新时间。如果您想每 100 毫秒获取一次更新,那么只需将您的从站设置为每 50 毫秒轮询一次,您将在任何现代系统上都做得很好。如果您需要亚毫秒计时,请使用内存。 +1 用于解释。然而,这意味着我的磁盘会一直在旋转(并且对其他请求的响应速度变慢并且消耗更多能量)? @Pygmalion:操作系统中的文件系统层将强制此文件进入内存(缓冲区),并且如果您所做的只是读取它,则不会继续旋转驱动器。如果您不断地编写它,那么它将被相当快地推回底层磁盘并导致旋转(但通常不会延迟或响应不佳)。您也可以使用ImDisk 之类的工具创建一个 ram 磁盘来放置此文件。【参考方案2】:

这两个进程(下面的 foo 和 bar)不能简单地成为主进程的线程吗?

import time
import threading

x = 0.0
y = 0.0
z = 0.0
lock = threading.RLock()

def foo():
    global lock
    while True:
        time.sleep(10)
        with lock:
            print x, y, z

def bar():
    global x, y, z, lock
    while True:
        time.sleep(2)
        with lock:
            x += 0.5
            y += 0.6
            z += 0.7

fooThread = threading.Thread(target=foo)
fooThread.daemon = True
barThread = threading.Thread(target=bar)
barThread.daemon = True

barThread.start()
fooThread.start()

“锁”可能不是必需的,但在多线程编程中是一种很好的做法。

【讨论】:

诱人的想法,但不是。更具体地说,有一个程序(“master”)用于测量和管理温度,而其他程序(“slave”)用于测量其他东西。这些程序中的每一个都有数百行长,而且差异太大,无法成为单个进程的一部分。 这个问题听起来像是多线程的理想候选者,每个“测量器”都有一个单独的线程。假设您的每个轮询服务都是一个类,那么为每个轮询服务启动一个线程应该是微不足道的。如果你决定将它们分开,问题就会变得更加困难。独立进程的全部意义在于保持内存隔离——一个人不能简单地(或容易地)“访问”另一个进程的内存空间。我会亲自研究 Flask 为每个服务创建一个 RESTful 端点,或者您最初发布的 IPC 问题的答案。【参考方案3】:

最后我使用了 RPyC 库 (https://rpyc.readthedocs.org/en/latest/)。易于使用且功能强大。

【讨论】:

以上是关于一个 python 进程为另一个 python 进程提供信息的主要内容,如果未能解决你的问题,请参考以下文章

python 进程

python- 进程与线程 一

Python多线程进程入门1

Python:如何将日期时间/时间戳从一个时区转换为另一个时区?

在 Python 中查找将一个集群列表转换为另一个集群的映射

将 Python 列表值的平均值转换为另一个列表