python 多文件共享全局变量或对象

## ===================== 多线程 ==============

定义 global_obj.py 文件
分别在不同的文件中赋值,调用

class WebSocket:
    ws = None
    @classmethod
    def send(cls,message):
        cls.ws.send(message)

多文件共享全局变量

定义 global_value.py 文件
分别在不同的文件中赋值,调用

# -*- coding: utf-8 -*-
def _init():
    global _global_dict
    _global_dict = {}


def set_value(key,value):
    _global_dict[key] = value


def get_value(key,defValue=None):
    try:
        return _global_dict[key]
    except KeyError:
        return defValue

===================== 多进程 ==============

import time
from multiprocessing import Process, Manager

def add_data(obj):
    """
    写
    """
    obj.update({
        "key":"add_data"
    })
    print("00000000000000000000000000 ===========写")
    print(obj)

def read_data(obj):
    """
    读
    """
    print("111111111111111111111111 ============ 读")
    print(obj)

if __name__ == "__main__":
    manage = Manager()
    dict1 = manage.dict()
    p1 = Process(target=add_data, args=(dict1,))
    p1.start()
    p1.join()

    p2 = Process(target=read_data, args=(dict1,))
    p2.start()
    p2.join()
    print("\n==============全局读=================")
    print(dict1)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python 中,共享变量通常指的是可以在多个函数或线程之间直接访问和修改的变量。这可能会导致并发问题,因为没有适当的同步机制,如果多个部分同时改变同一个值,结果可能是不可预测的。Python 提供了一些工具来处理这种情况: 1. **全局变量**:如果你确实需要在所有函数中共享数据,可以定义为全局变量(用 `global` 关键字声明)。但请注意,全局变量在程序的所有模块间都是可见的,因此应谨慎使用,避免副作用。 ```python # 全局变量示例 global_var = 0 def increment(): global global_var global_var += 1 increment() print(global_var) # 输出:1 ``` 2. **模块级作用域**:在模块内部定义的变量通常是共享的,但在不同文件中使用时需注意作用域。 3. **进程/线程共享**: 使用 `multiprocessing` 或 `threading` 模块时,可以通过 `Manager` 对象创建共享的数据结构,如 `Value`, `Array`, `Lock` 等,它们提供了更安全的方式来共享数据。 ```python from multiprocessing import Manager manager = Manager() shared_list = manager.list([0, 0]) def worker(index): shared_list[index] += 1 processes = [Process(target=worker, args=(i,)) for i in range(2)] for p in processes: p.start() p.join() print(shared_list) # 输出:[1, 1] ``` 4. **类属性与实例属性**:在类中,实例变量(即成员变量)默认是在每个实例上独立存储的。但如果设置为 `@classmethod` 或 `@staticmethod`,则会成为类的共享属性。 5. **命名空间管理**:Python 遵循词法作用域规则,通过局部作用域、闭包等方式可以控制变量的可见性和访问权限,减少意外的共享。 然而,推荐在设计复杂系统时优先考虑使用适当的数据结构(如列表、字典等)、函数参数传递或消息传递(队列、事件、信号量),而不是直接共享变量,以便更好地维护代码的清晰性和一致性。对于并发编程,了解如何使用锁(如 `Lock`、`RLock` 或 `Semaphore`)和其他同步原语是非常重要的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值