【问题标题】:what does "not threadsafe" mean? Using SimpleCache (python dictionary Cache) in Flask app“非线程安全”是什么意思?在 Flask 应用程序中使用 SimpleCache(python 字典缓存)
【发布时间】:2020-08-10 05:06:03
【问题描述】:

我正在考虑使用 SimpleCache 将 Python 数据帧存储在 DASH 应用程序中。显然它只是使用 Python 字典。是否可以从 SimpleCache 中获取部分写入的数据帧?这是我最关心的问题。

由于线程,我还会遇到哪些其他问题?

【问题讨论】:

    标签: python flask flask-caching


    【解决方案1】:

    “非线程安全”是什么意思?

    当您使用像gunicorn 这样的WSGI 服务器部署应用程序时,您可能会有多个worker。因为SimpleCache 是一个内存缓存,并且每个worker 都有自己分配的内存,所以一个worker 设置的缓存键对另一个worker 是不可用的。如果不考虑这可能会导致奇怪的行为,因为对您的应用程序的单独请求由不同的工作人员处理。这在使用开发服务器运行时不会很明显,因为只有一个进程。

    解决方法是使用像 Redis 这样的缓存后端(见下文)。这意味着所有工作人员都在查看同一个缓存。

    是否可以从 SimpleCache 中获取部分写入的数据帧?

    您可能应该测试自己的实现,但这里有一个非常基本的示例:

    >>> import pandas as pd
    >>> d = {'col1': [1, 2], 'col2': [3, 4]}
    >>> df = pd.DataFrame(data=d)
    >>> df
       col1  col2
    0     1     3
    1     2     4
    

    请注意,从 werkzeug 1.0 开始,SimpleCache 已移出到 cachelib。所以在做pip install cachelib之后你可以把df添加到缓存中并解压。

    >>> from cachelib import SimpleCache
    >>> cache = SimpleCache()
    >>> cache.add('somekey', df)
    True
    >>> cache.get('somekey')
       col1  col2
    0     1     3
    1     2     4
    

    要在你的 redis 服务器上使用它应该很简单,只需将前两行更改为:

    from cachelib import RedisCache
    cache = RedisCache(host='your-redis-server')
    

    这意味着生产中的最小代码更改允许您在开发时仍然使用SimpleCache。 (addget 是两个类的方法)。

    【讨论】:

    • 我们实际上从未计划将其扩展到一个进程之外。我感谢你的时间。 simplecache 的速度应该远远超过我们的要求。从长远来看,我们可能会考虑 redis。但是我们要缓存的一些值是几百 mb。
    猜你喜欢
    • 2015-06-02
    • 2014-05-19
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多