首先解释下什么是同步:
同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。
"同"字从字面上容易理解为一起动作
其实不是,"同"字应是指协同、协助、互相配合。
如进程、线程同步,可理解为进程或线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B依言执行,再将结果给A;A再继续操作。
from threading import Thread, Lock
import time
class Test1(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
while True:
# 虽然是while true但是test1的输出也不会多,因为当第二次循环时锁已经被第一次占用了,不在t3释放无法重新获取锁
if lock1.acquire():
print('----test1----')
time.sleep(0.8)
lock2.release()
class Test2(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
while True:
if lock2.acquire(): # 因为第二把锁已经在下方上了锁,所以需要等着被解锁后才能抢到锁执行
print('----test2---')
time.sleep(0.8)
lock3.release()
class Test3(Thread):
def __init__(self):
Thread.__init__(self)
def run(self):
while True:
if lock3.acquire(): # 因为第三把锁已经在下方上了锁,所以需要等着被解锁后才能抢到锁执行
print('----test3----')
time.sleep(0.8)
lock1.release()
if __name__ == '__main__':
lock1 = Lock() # 使用lock方法创建的锁默认没有锁上
# lock1.acquire() # 第一把锁不能在这里上锁,因为2和3都上了锁,线程运行时不能获取到锁后使其运行
lock2 = Lock()
lock2.acquire() # 创建第二把锁并且锁上
lock3 = Lock()
lock3.acquire() # 创建第三把锁并且锁上
t1 = Test1()
t2 = Test2()
t3 = Test3()
t1.start()
t2.start()
t3.start()
返回:
----test1----
----test2---
----test3----
----test1----
----test2---
----test3----
----test1----
----test2---
----test3----
----test1----
总结
- 可以使用互斥锁完成多个任务,有序的进程工作,这就是线程的同步