"not threadsafe"是什么意思?在 Flask 应用程序中使用 SimpleCache(python 字典 Cache)



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

由于线程处理,我还可能遇到哪些其他问题?

"非线程安全"是什么意思?

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

解决方法是使用像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是这两个类的方法(。

最新更新