微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

两个脚本之间的 Python IPC 共享内存

如何解决两个脚本之间的 Python IPC 共享内存

我正在尝试为 RaspBerry Pi3 开发应用程序。事实上2个应用程序。应用程序 1 将是一个简单的 gpio 读取,计算特定 gpio 输入变高的次数登录到 file 。应用程序 2 将在屏幕上显示 GPIO 状态。我希望应用程序 1 持续运行并记录数据。这就是为什么我将其与基于 UI 的应用程序分开的原因。 现在我想从应用程序 1 获取 gpio 状态 - 数据将是 pin1State、pin1HighCount、pin2State、pin2HighCount。所有这些都将是整数。 应用程序 2 应该从应用程序 1 获取数据并显示在基于 pyqt5 的 UI 屏幕中。 我试着按照这个例子 IPC shared memory across Python scripts in separate Docker containers 但我发现它是基于字典的数据交换,而且它不是连续的或几乎是实时的。 字典首先填充,然后加载到 server.py 我无法在其他地方找到有关此方法的太多信息。 我喜欢不使用文件(临时或其他)的基于本地主机的套接方法。 但我无法获得连续的数据。 此外,是否可以使用列表甚至单个整数变量而不是字典。我担心通过不断更新(附加)到字典,如果脚本长时间运行,它可能会造成内存过载 我的代码如下 服务器.py

from multiprocessing.managers import SyncManager
import multiprocessing

patch_dict = {}



def load_patch_dict():

    
    value = input("Press key to continue \n")
    for i in range(0,2000):
        patches = 1
        
        patch_dict.update([(i,i)])
        print("Patch Print ",i," . ",patch_dict)
       
    #print(patch_dict)

def get_patch_dict():
    
    return patch_dict

class MyManager(SyncManager):
    pass

if __name__ == "__main__":
    load_patch_dict()
    port_num = 5000
    MyManager.register("patch_dict",get_patch_dict)
    manager = MyManager(("127.0.0.1",port_num),authkey=b"password")
    # Set the authkey because it doesn't set properly when we initialize MyManager
    multiprocessing.current_process().authkey = b"password"

    manager.start()

    input("Press any key to kill server".center(50,"-"))
    manager.shutdown()


客户端.py

rom multiprocessing.managers import SyncManager
import multiprocessing
import sys,time

class MyManager(SyncManager):
    pass

# MyManager.register("patch_dict")

if __name__ == "__main__":
    port_num = 5000
    MyManager.register("patch_dict")
    manager = MyManager(("127.0.0.1",authkey=b"password")
    multiprocessing.current_process().authkey = b"password"
    manager.connect()
    patch_dict = manager.patch_dict()

    keys = list(patch_dict.keys())

    #print("Keys ",keys)
    value = input("Press key to continue \n")
    do_loop = True
    i=1
    for key in keys:
    
        
        image_patches = manager.patch_dict.get(key)
        
        print("This is ",image_patches)
        

解决方法

好的。目标是在 2 个 python 脚本之间共享数据。我放弃了从另一个问题中获取的上述解决方案。相反,我采用了不同的方法:使用 memcache 我首先使用 pip 安装了 python-memcached 然后我使用了以下代码 程序A

import time
import memcache

def run_loop():

    client = memcache.Client([('127.0.0.1',5000)])
    value = input("Press key to continue \n")
    for i in range(0,20000):
        sendvalue = "It Is " + str(i)
        client.set('Value',sendvalue)
        print("sent value  ",sendvalue)
        time.sleep(0.005)

if __name__ == "__main__":
    run_loop()

程序 B

import sys,time
#import pymemcache
import memcache
if __name__ == "__main__":
    #print("Keys ",keys)
    value = input("Press key to continue \n")
    do_loop = True
    i=1
    client = memcache.Client([('127.0.0.1',5000)])
    #for key in keys:
    while do_loop:
        ret_value =  client.get('Value')
        if ret_value != None:
            print("Value returned is ",ret_value)

重要 *** 启动 memcached 。我正在使用 Linux 来运行这些程序。不确定windows环境

就我在 linux 机器上的测试而言,数据正在正确共享。 当然,我必须测试移动列表、数据交换等,我认为这应该不是问题。 我从 How to share variables across scripts in python? 尝试了同样的方法 我遇到了一些问题。当然,memcached 应该正在运行 但这确实有帮助:https://realpython.com/python-memcache-efficient-caching/

其实我们也可以给缓存设置过期时间。太棒了 我仍在学习。所以如果我在某处错了,请纠正我 谢谢

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。