多线程Python代码中的数据不一致性

2024-05-13 04:50:17 发布

您现在位置:Python中文网/ 问答频道 /正文

第一次,所以用户在这里。我的“线程安全”Python单例有问题。该类存储仅由工作线程读取的数据。主线程更新一些数据。我的印象是,单例将确保我的工作线程能够访问相同的数据。然而,在现实中,一些线程仍然处理“旧”数据(主线程中的预数据更改)

我使用了来自https://refactoring.guru的单例实现:

from threading import Lock

class SingletonMeta(type):
    _instances = {}
    _lck = Lock()

    def __call__(cls, *args, **kwargs):
        with cls._lck:
            if cls not in cls._instances:
                instance = super().__call__(*args, **kwargs)
                cls._instances[cls] = instance
        return cls._instances[cls]

class Storage(metaclass=SingletonMeta):
    def __init__(self, shared=None):
        self._shared = shared

    @property
    def shared(self):
        return self._shared

    def refresh(self, update):
        if update:
            self._shared['managed'] = update
            logger.debug("[+] Shared data refreshed.")

refresh()方法仅从主线程调用。工作线程通过shared属性读取字典

这是正确的方法吗?恐怕不行,因为工作线程之间的数据不一致。有人能帮我理解我做错了什么,为什么没有更新所有线程的数据吗

多谢各位

更新

经过更多的调查和阅读,结果证明,单身并不是问题所在。我的问题(我之所以没有提到,是因为我一开始没有想到这一点)根源于不同的gunicorn worker流程。因此,应用数据更新的辅助进程中的线程拥有正确的数据,而其他线程则没有。我将不得不考虑如何在工作人员之间同步数据


Tags: 数据instancesselflockdefupdatecall线程