カウント セマフォを使用してスレッドをブロックし、後でウェイクアップすることができます。
カウンティング セマフォは、負でない整数カウントを持つオブジェクトです。カウントが 0 のときにスレッドがセマフォを呼び出すと、スレッドはacquire()
セマフォのカウントが 0 より大きくなるまでブロックされます。スレッドのブロックを解除するには、別のスレッドがセマフォを呼び出してセマフォのカウントを増やす必要がありますrelease()
。
2 つのセマフォを作成します。1 つはワーカーをブロックし、もう 1 つはプロセッサをブロックします。ワーカー セマフォをすぐに実行したいので、ワーカー セマフォのカウントを 1 から開始します。ワーカーが完了するまでブロックする必要があるため、プロセッサのセマフォのカウントを 0 から開始します。
セマフォをワーカー クラスとプロセッサ クラスに渡します。ワーカーが 10 秒間実行された後、 を呼び出してプロセッサをウェイクアップしprocessorSemaphore.release()
、次に を呼び出してセマフォでスリープする必要がありworkerSemaphore.acquire()
ます。プロセッサも同じことを行います。
#!/usr/bin/env python
from threading import Thread, Semaphore
import sys
import time
INTERVAL = 10
class Worker(Thread):
def __init__(self, workerSemaphore, processorSemaphore):
super(Worker, self).__init__()
self.workerSemaphore = workerSemaphore
self.processorSemaphore = processorSemaphore
def run(self):
while True:
# wait for the processor to finish
self.workerSemaphore.acquire()
start = time.time()
while True:
if time.time() - start > INTERVAL:
# wake-up the processor
self.processorSemaphore.release()
break
# do work here
print "I'm working"
class Processor(Thread):
def __init__(self, workerSemaphore, processorSemaphore):
super(Processor, self).__init__()
print "init P"
self.workerSemaphore = workerSemaphore
self.processorSemaphore = processorSemaphore
def run(self):
print "running P"
while True:
# wait for the worker to finish
self.processorSemaphore.acquire()
start = time.time()
while True:
if time.time() - start > INTERVAL:
# wake-up the worker
self.workerSemaphore.release()
break
# do processing here
print "I'm processing"
workerSemaphore = Semaphore(1)
processorSemaphore = Semaphore(0)
worker = Worker(workerSemaphore, processorSemaphore)
processor = Processor(workerSemaphore, processorSemaphore)
worker.start()
processor.start()
worker.join()
processor.join()