Aam*_*nan 9 python django thread-safety python-multithreading
我将字典存储在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)
Run Code Online (Sandbox Code Playgroud)
是否有可能Point2在会话更新后更新线程字典Point1也更新它,然后我stop退出线程丢失.
更多信息
ajax请求启动四个线程,从4个不同的URL下载样本.为什么我使用线程?因为我想向用户显示当前正在下载的样本和剩下的样本.所有线程都将在会话中的字典中更新其状态.线程启动后,我每隔两秒钟发出一次ajax请求,并从会话中获取字典并读取线程的当前状态.但是这个想法失败了,因为线程独立于请求及其会话.每个ajax请求肯定都有它的会话,但是我无法将该会话传递给线程,因为当它们一旦开始时它们独立于世界的其余部分(可能是我可以通过它但我可能不会快速通过它,因为处理正在由线程).所以要解决这个问题,我选择缓存框架而不是会话.因为缓存可以从任何地方访问.线程将它们的状态存储在字典中并重新放入缓存中,每两秒钟后我从缓存中获取字典并读取状态.根据我的经验,缓存还有一件事是线程安全的.因此,对于四个线程,我使用了四个字典.
request.session返回的对象将是每个请求的新对象,访问相同的存储.此外,它们在请求时从存储器加载并在响应时保存回来.因此,如果您希望将信息从长时间运行的线程传输到另一个请求,则需要手动将其保存在长时间运行的线程中.不幸的是,这将导致修改同一会话的数据丢失.
在某种意义上,Session是线程安全的.你不会以这种方式打破翻译.您的请求将在第一次访问时将会话数据视为其快照,并且在保存时它将覆盖自该时刻起落下的所有更改.因此会话状态将保持一致,但某些请求的修改可能会丢失.
实际上,这个属性对于几乎任何框架都是通用的 - 任何会话/缓存/可能在多个进程之间共享的其他存储都不太可能提供对存储在其中的对象的修改,而不会覆盖某人的更改.
| 归档时间: |
|
| 查看次数: |
3566 次 |
| 最近记录: |