複数のスレッドからアクセスできる 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
更新すると、stop
スレッドを終了するためのスレッドが失われる可能性はありますか。
より詳しい情報
ajax リクエストは、4 つの異なる URL からサンプルをダウンロードする 4 つのスレッドを開始します。スレッドを使用した理由 現在ダウンロード中のサンプルと残っているサンプルをユーザーに表示したいからです。すべてのスレッドは、セッション内のディクショナリでその状態を更新します。スレッドが開始された後、2 秒ごとに ajax リクエストを作成し、セッションから辞書を取得して、スレッドの現在の状態を読み取ります。しかし、スレッドはリクエストとそのセッションから独立しているため、このアイデアは失敗しました。各 ajax リクエストには必ずセッションがありますが、そのセッションをスレッドに渡すことはできません。スレッドが開始されると、他の世界から独立しているためです (渡すことはできますが、スレッドによって処理が行われているほど速く渡すことはできません)。スレッド)。この問題に取り組むために、セッションではなくキャッシュ フレームワークを選択します。キャッシュはどこからでもアクセスできます。スレッドは状態を辞書に保存してキャッシュに戻し、2 秒ごとにキャッシュから辞書を取得して状態を読み取ります。私の経験によると、キャッシュはスレッドセーフではありません。したがって、4 つのスレッドに対して、4 つの辞書を別々に使用しました。