我使用此代码来演示1线程如何使用Semaphore,另一个线程将等待(非阻塞),直到Sempahore可用。
这是使用Python3.6编写的;未在任何其他版本上测试。
这只会工作是同步正在从同一个线程完成,来自单独进程的IPC将无法使用此机制。
import threading
from time import sleep
sem = threading.Semaphore()
def fun1():
print("fun1 starting")
sem.acquire()
for loop in range(1,5):
print("Fun1 Working {}".format(loop))
sleep(1)
sem.release()
print("fun1 finished")
def fun2():
print("fun2 starting")
while not sem.acquire(blocking=False):
print("Fun2 No Semaphore available")
sleep(1)
else:
print("Got Semphore")
for loop in range(1, 5):
print("Fun2 Working {}".format(loop))
sleep(1)
sem.release()
t1 = threading.Thread(target = fun1)
t2 = threading.Thread(target = fun2)
t1.start()
t2.start()
t1.join()
t2.join()
print("All Threads done Exiting")
当我运行这个 - 我得到以下输出。
fun1 starting
Fun1 Working 1
fun2 starting
Fun2 No Semaphore available
Fun1 Working 2
Fun2 No Semaphore available
Fun1 Working 3
Fun2 No Semaphore available
Fun1 Working 4
Fun2 No Semaphore available
fun1 finished
Got Semphore
Fun2 Working 1
Fun2 Working 2
Fun2 Working 3
Fun2 Working 4
All Threads done Exiting
Thx寻求帮助,但是我发现了真正的问题,因为我在两个线程中都使用相同的信号量,第一个信号几乎立即完成,因此第二个信号无法获得锁定并执行。 –
@VictorTurrisi如果你输入一个大范围并运行你的程序,然后将输出重定向到一个文件然后检查该文件,你可能会看到“2”确实被打印出来,但是,它像很多1,然后很多2,然后又是很多1,等等。这是因为它执行得太快,你需要在它们之间放置一个'time.sleep()'来看它们是否一个接一个地执行。 –