以下は、複数スレッドから同時アクセスされたときに前回のアクセス時間よりも2秒以上経過していなければ待機して、経過後にアクセス時間を記録して、この値をreturnする処理
import time
import threading
lock = threading.Lock()
access_time = time.time()
def task():
while True:
print(concurrent_access())
pass
def concurrent_access():
"""複数スレッドに同時にアクセスされるかもしれない処理"""
# 前回のアクセス時間より2秒以上経過して "いる"
# access_timeを現在時刻にしてから
# access_timeをreturn
# 前回のアクセス時間より2秒以上経過して 'いない"
# 2秒経過するまで待機
# 2病経過したら上と同じ処理
global access_time
try:
# 現在のスレッド名を表示
print(threading.current_thread().name)
lock.acquire()
while True:
if access_time + 2 < time.time():
access_time = time.time()
return access_time
finally:
lock.release()
ths = []
for i in range(3):
th = threading.Thread(target=task, name=f'thread{i}')
th.start()
ths.append(th)
for th in ths:
th.join()
実行結果
thread0
thread1
thread2
1648015757.6682205
thread0
1648015759.6691394
thread1
1648015761.6700594
thread2
1648015763.6702552
thread0
1648015765.671093
thread1
1648015767.6731405
thread2