线程同步
锁和信号量
- 通过锁和信号量,也是
Lock和Semphore,可以保证一个线程结束之后另一个线程在开始
lock = Lock() # 线程互斥锁Lock
s = Semaphore(10) # 信号量Semaphore
- 示例代码
from threading import Thread,Lock,Semaphore,current_thread
import time
def work(s,obj):
with s:
time.sleep(0.5) # 类似等待IO
obj[0] += 1
print(obj)
def main():
work_list = []
obj = [0]
#s = Lock()
s = Semaphore(3)
for var in range(10):
work_list.append(Thread(target=work,args=(s,obj)))
for func in work_list:
func.start()
for func in work_list:
func.join()
if __name__ == '__main__':
main()
线程队列
Queue为安全队列,类似进程中Queue,内部实现了锁;通过控制线程对于Queue数据的操作,间接的实现同步
from queue import Queue
q = Queue(maxsize) # 如果给定参数为指定大小队列,如果没有给该参数,为无限队列
q.qsize() # 返回队列大小
q.empty() # 判断是否为空,为空时get抛出异常
q.full() # 判断是否队列已满,满时put抛出异常
q.get(block=True) # 从队列中取值,取不到则阻塞
q.put(block=True) # 放一个值到队列里,放不进去则阻塞qu'bu
- 示例代码
from threading import Thread, Lock, Semaphore,current_thread
from queue import Queue
import time
def work(q):
for var in range(10):
value = q.get()
print(current_thread().name,':',value)
def main():
q = Queue()
work_list = []
t = Thread(target=work,args=(q,))
t.start()
for var in range(10):
q.put(var)
time.sleep(0.5) # 存放数据等到.5s
t.join()
if __name__ == '__main__':
main()