python多进程共享变量、python多进程共享对象最佳解决方案

python多进程共享变量、python多进程共享对象最佳解决方案

引言

在 Python 中,多进程编程可以通过 multiprocessing 模块实现,但进程间共享Python对象往往比较困难。memory_obj_server 提供了一种新方式,利用共享内存管理变量,解决了传统方法的易用性问题。

memory_obj_server 简介

memory_obj_server 项目通过一个后台服务进程管理共享内存,多个客户端进程可以通过简单的接口访问和修改共享变量。

使用效果图

在这里插入图片描述

安装

# 第一种PyPi安装
pip install -U memory-obj-server 
# 第二种源码安装
git clone https://github.com/15525730080/memory_obj_server.git
cd memory_obj_server
pip install -r requirements.txt

快速使用

from memory_obj_server import ObjectStoreService, ObjectStoreClient
ObjectStoreService.start_server()  # 启动server
client = ObjectStoreClient()  # 使用client去共享对象
client.put('obj', {'a': 1, 'b': 2})
client.get('obj')
client.put('obj', {'c': 3})
client.get('obj')
client.delete('obj')
client.get('obj')
with ObjectStoreClient() as client_ctx:
    client_ctx.put('hello', 'world')
    print("client get hello:", client_ctx.get('hello'))

ObjectStoreService.stop_server()

使用实例

import time
from multiprocessing import Process, freeze_support
import os
from memory_obj_server import ObjectStoreService, ObjectStoreClient

# 启动对象存储服务
ObjectStoreService.start_server()

# 将 UserInfo 类移到全局作用域,提高代码复用性
class UserInfo:
    def __init__(self, age=20, height=175, weight=130):
        """
        构造函数,用于初始化用户信息
        :param age: 用户年龄,默认为 20
        :param height: 用户身高,默认为 175
        :param weight: 用户体重,默认为 130
        """
        self.age = age
        self.height = height
        self.weight = weight

    def update_age(self, new_age):
        """
        更新用户的年龄
        :param new_age: 新的年龄
        """
        if isinstance(new_age, int) and new_age > 0:
            self.age = new_age
        else:
            print("输入的年龄不合法,请输入一个正整数。")

    def update_height(self, new_height):
        """
        更新用户的身高
        :param new_height: 新的身高
        """
        if isinstance(new_height, (int, float)) and new_height > 0:
            self.height = new_height
        else:
            print("输入的身高不合法,请输入一个正数。")

    def update_weight(self, new_weight):
        """
        更新用户的体重
        :param new_weight: 新的体重
        """
        if isinstance(new_weight, (int, float)) and new_weight > 0:
            self.weight = new_weight
        else:
            print("输入的体重不合法,请输入一个正数。")

    def display_info(self):
        """
        显示用户的信息
        """
        print(f"当前进程id: {os.getpid()}")
        print(f"年龄: {self.age} 岁")
        print(f"身高: {self.height} 厘米")
        print(f"体重: {self.weight} 斤")

def set_user_info():
    try:
        # 创建 UserInfo 对象
        user = UserInfo()
        # 创建对象存储客户端
        client = ObjectStoreClient()
        # 将用户信息存入对象存储
        client.put('user', user)
        # 显示用户信息
        user.display_info()
        print("set")
        # 等待 10 秒
        time.sleep(7)
        print("other process set after")
        user = client.get('user')
        user.display_info()    
        time.sleep(10)   
    except Exception as e:
        print(f"set_user_info 函数出现异常: {e}")

def get_user_info():
    try:
        # 创建对象存储客户端
        client = ObjectStoreClient()
        # 从对象存储中获取用户信息
        user = client.get('user')
        # 显示用户信息
        user.display_info()
        # 更新用户信息
        user.update_age(22)
        user.update_height(178)
        user.update_weight(135)
        # 再次显示更新后的用户信息
        # 等待 3 秒
        # 将更新后的用户信息存入对象存储
        client.put('user', user)
        # 等待 10 秒
        time.sleep(10)
    except Exception as e:
        print(f"get_user_info 函数出现异常: {e}")

if __name__ == '__main__':
    freeze_support()
    # 创建设置用户信息的进程
    p1 = Process(target=set_user_info)
    # 创建获取用户信息的进程
    p2 = Process(target=get_user_info)
    # 启动设置用户信息的进程
    p1.start()
    # 等待 3 秒后启动获取用户信息的进程
    time.sleep(3)
    p2.start()
    # 等待 p1 进程完成
    p1.join()
    # 等待 p2 进程完成
    p2.join()
    print("所有子进程已完成。")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值