Python Django会话是线程安全的吗?

Python Django会话是线程安全的吗?,python,django,thread-safety,python-multithreading,Python,Django,Thread Safety,Python Multithreading,我将字典存储在Django会话中,该会话可由多个线程访问。所有线程都可以更新该字典,线程还可以从字典中获取值以运行进程。我想知道Django会话是线程安全的还是必须使用锁或信号量 典型示例: Thread1: threadDict = request.session.get('threadDict', None) if threadDict['stop']: #break the for loop exit the thread else: #do some processing a

我将字典存储在Django会话中,该会话可由多个线程访问。所有线程都可以更新该字典,线程还可以从字典中获取值以运行进程。我想知道Django会话是线程安全的还是必须使用锁或信号量

典型示例:

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
之后更新线程字典并同时更新它时,是否有可能丢失退出线程的我的
停止

更多信息


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

Python中的基本类型通常是线程安全的,这要归功于。在某些情况下(例如在执行I/O时)会释放此锁,以允许其他线程访问。这意味着您(应用程序)必须在可能释放GIL的调用之间保持一致状态。这种方法的例子是阻塞套接字操作。

我不确定django是否是线程安全的。 例如,如果使用Apache+mod_wsgi config,每个进程有多个线程,那么django/core/urlresolvers.py就不是线程安全的。 但他们努力做到这一点。
django票务系统上有一些票证

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

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


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

Django会话是在进程开始时获取的字典请求处理并在结束时保存回来[]。 因此,如果您对它执行并行更改,那么其中一个更改将占上风。但通常情况下,人类用户无法执行此类并行操作,业务只能继续进行

现在,我不太明白你的例子,但看起来你只是想滥用会话字典。我已经开发了很多基于Django的网站,我研究了一些与Django本身的限制或缺陷相关的问题,但是仍然从多个线程处理会话dict在我看来就像是一个滥用会话的教科书示例


也许我们可以在你写更多关于你想要实现的东西时找到解决方案?

正如@Krumelur提到的,Python线程不会同时运行,因为全局interpeter锁(GIL)-这是一个缺陷,不是一个特性,所以不要依赖它


当前的解决方法是使用创建子流程。您可以使用流程实例的is_alive()函数检查并查看子流程是否正在运行。请参阅文档。

是否有一种方法可以在某些函数中访问django会话而不使用
请求。会话
我想直接访问会话??为什么不使用request.session?我想将线程的状态存储在某个位置,因为一旦启动线程,我就无法一次又一次地传递请求,一旦我启动了这个进程,我就会发出ajax请求,检查会话中存储的字典的状态,以了解线程的当前状态。所以我在想,是否有任何方法可以直接访问会话,以便线程可以存储其状态??每个AJAX请求都会获得不同的请求对象,但它们可以通过request.session共享会话的数据。我不知道你在这里所说的线程是什么意思。您通常不必关心Django中的线程。