gpt4 book ai didi

python - Django session 线程安全吗?

转载 作者:太空狗 更新时间:2023-10-29 20:22:00 24 4
gpt4 key购买 nike

我在 Django session 中存储了一个字典,它可以被多个线程访问。所有线程都可以更新该字典,线程也可以从字典中获取值以运行该进程。我想知道 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 更新 session 中的线程字典时,是否有可能在它更新 Point1 之后也更新它,然后我的 stop 到退出线程丢失。

更多信息

ajax 请求启动四个线程,从 4 个不同的 url 下载示例。为什么我使用线程?因为我想向用户展示当前正在下载哪些样本,哪些还剩下。所有线程都将在 session 中的字典中更新其状态。线程启动后,我每两秒发出一次 ajax 请求,并从 session 中获取字典并读取线程的当前状态。但是这个想法失败了,因为线程独立于请求及其 session 。每个 ajax 请求肯定有它的 session ,但我不能将该 session 传递给线程,因为当它们一旦开始时,它们就独立于世界的其他部分(也许我可以传递它,但我可能不会像处理正在完成的那样快地传递它线程)。所以为了解决这个问题,我选择缓存框架而不是 session 。因为可以从任何地方访问缓存。线程将它们的状态存储在字典中并放回缓存中,每两秒后我从缓存中取出字典并读取状态。根据我的经验,还有一件事缓存不是线程安全的。所以对于四个线程,我分别使用了四个字典。

最佳答案

返回的 request.session 对象对于每个请求都是一个新对象,访问相同的存储。此外,它们在请求时从存储中加载并在响应时保存回来。因此,如果您希望将信息从一个长时间运行的线程传输到另一个请求,您需要手动将其保存在长时间运行的线程中。不幸的是,这将导致对同一 session 数据的修改丢失。

Session 在某种意义上是线程安全的。您不会以这种方式破坏解释器。您的请求将在第一次访问时将 session 数据视为它的快照,并且在保存时将覆盖自那一刻起发生的所有更改。所以 session 状态会保持一致,但一些请求的修改可能会丢失。

实际上,此属性对于几乎所有框架都是通用的 - 可能在多个进程之间共享的任何 session /缓存/一些其他存储不太可能提供对存储在其中的对象的修改,而不会有人的更改被覆盖。

关于python - Django session 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8212050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com