我将字典存储在可由多个线程访问的 Django 会话中。所有线程都可以更新该字典,线程还从字典中获取值以运行进程。我想知道 Django Session 是线程安全的还是我必须使用锁或信号量?
典型例子:
Thread1:
threadDict = request.session.get('threadDict', None)
if threadDict['stop']:
#break the for loop exit the thread
else:
#do some processing and update some values in thread dictionary
threadDict['abc'] = 0
request.session['threadDict'] = threadDict (Point1)
def someFunction():
#this function is used to send stop signal to thread
threadDict = request.session.get('threadDict', None)
threadDict['stop'] = True
request.session['threadDict'] = threadDict (Point2)
是否有可能在Point2
更新后的会话中更新线程字典Point1
也更新它,然后我stop
要退出的线程丢失。
更多信息
一个 ajax 请求启动四个线程,这些线程从 4 个不同的 url 下载样本。为什么我使用线程?因为我想向用户显示当前正在下载哪些样本以及剩下哪些样本。所有线程都将在会话中更新其字典中的状态。线程启动后,我每两秒发出一次 ajax 请求,并从会话中获取字典并读取线程的当前状态。但是这个想法失败了,因为线程独立于请求及其会话。每个 ajax 请求肯定都有它的会话,但我不能将该会话传递给线程,因为当它们一旦开始时,它们就独立于世界其他地方(也许我可以传递它,但我可能无法以最快的速度传递它,处理正在由线程)。所以为了解决这个问题,我选择缓存框架而不是会话。因为缓存可以从任何地方访问。线程将它们的状态存储在字典中并放回缓存中,每两秒我从缓存中取出字典并读取状态。根据我的经验,还有一件事缓存不是线程安全的。所以对于四个线程,我分别使用了四个字典。