Python ロック
今回はロックをやります。Javaのsynchronizedみたいなことができます。Django のサンプル
Django Get Postで作ったサンプルを変更します。先にそちらで環境を作って下さい。hello/templates/test.html
from threading import Lock
from time import sleep
from django.shortcuts import render
# ロックオブジェクトを取得。最初に1回だけ実行
lock = Lock()
def index(request):
message = request.POST.get("prm", "World")
# ロックを取得。取得に成功するとTrueが戻される
if lock.acquire(blocking=False):
# ロック取得成功時の処理
try:
dic = {"msg": message}
if message != "World":
sleep(5)
finally:
# 取得したロックは必ずリリースする
lock.release()
else:
# ロック取得失敗時の処理
dic = {"msg": "LOCKされていた"}
return render(request, 'test.html', dic)
acquireでロックを取得。今回はロック取得に失敗したら待たずに次の処理にいくが、ロックを取得するまで待たせることができる。
# ロックを取得。ロックが取得できるまで待つ
if lock.acquire():
# ロックを取得。ロックが取得できるまで3秒だけ待つ
if lock.acquire(timeout=3):
ページのトップへ戻る