我在Django settings.py
中定义了一个dict,充当所有用户的伪造的临时数据缓存。但是,引起我注意的是,它并没有按照我想要的方式运行,并且似乎是随机地重置为默认值。
settings.py
# initialize with a fake key:value for ease in logging
STORE_DATA = {'hello': 'goodbye'}
views.py
def get_data(name):
from apiclient.discovery import build
search_q = name
service = build('youtube', 'v3', developerKey='<key-here>')
results = service.search().list(
part='snippet',
channelId='<channel-here>',
type='video',
q=search_q,
).execute()
settings.STORE_DATA[name] = results['items']
result = settings.STORE_DATA[name]
return result
page.videos = []
if page.name in settings.STORE_DATA:
page.videos = settings.STORE_DATA[page.name]
else:
page.videos = get_data(page.name)
这是唯一引用此全局变量的代码。它只是存储youtube api调用的结果,因此我们不必每次有人访问页面时都进行查询。
但是-有时候这行得通,有时却行不通。有时,存储在字典中的key:value对会重置为初始状态。这是我的日志中的一些打印内容-
cache before the call - [u'hello']
"page1" - 2018-08-22 23:23:47
cache after the call - [u'page1', u'hello']
cache before the call - [u'hello']
"page1" - 2018-08-22 23:24:13
cache after the call - [u'page1', u'hello']
cache before the call - [u'page1', u'hello']
page1 - found in cache!
cache after the call - [u'page1', u'hello']
cache before the call - [u'page1', u'hello']
page1 - found in cache!
cache after the call - [u'page1', u'hello']
cache before the call - [u'hello']
"page1" - 2018-08-22 23:27:50
cache after the call - [u'page1', u'hello']
您可以看到第一次,它正确地在缓存中没有数据,因此将其存储。好。第二次...等等。数据不存在。再次存储。第三次和第四次-在那里!真好!第五次-wtf。再次消失。
这太奇怪了,对我来说毫无意义。任何人都知道会发生什么事吗?
答案 0 :(得分:1)
如果您为uwsgi
配置了多个工作程序,则每个工作程序都将拥有自己的Python解释器(每个工作程序将具有单独的字典副本)。因此,建议将单个数据存储用于缓存。
您可以通过将workers
(或processors
,它们是同义词)设置设置为1
来进行测试,以查看是否可以解决问题。