互斥锁
问题:因为线程之间共享全局变量,所以,在多线程几乎同时运行的时候,几乎同时修改一个全局变量的时候,就要进行控制
此时,需要互斥锁
当某个线程需要修改资源的时候,先将资源锁定,其他线程不能修改该线程,当线程修改完成后,并且释放完互斥锁之后,其他的线程才可以使用,互斥锁保证在当前只有一个线程可以使用修改同一个资源
import threading
num = 0
def add_num1():
global num
for i in range(100000000):
lock_fla = lock_obj.acquire(True)
if lock_fla: #如果锁住则加,不然不加
num += 1
lock_obj.release()
print('子线程1已经完成,此时得到的num',num)
def add_num2():
global num
for i in range(100000000):
lock_fla = lock_obj.acquire(True)
if lock_fla:
num += 1
lock_obj.release()
print('子线程2已经完成,此时得到的num',num)
if __name__ == '__main__':
a1=threading.Thread(target=add_num1())
a2=threading.Thread(target=add_num2())
lock_obj = threading.Lock()
a1.start()
a2.start()
消费者生成者模型
from threading import Thread
import queue
import time
#from queue import Queue python3的导包用法
#from Queue import Queue python2的导包用法
def consumer(name):
while True:
a=q.get()
time.sleep(2) #必须要,因为子线程几乎同时进行,如果不加停顿,那么在队列里还没有元素的时候刚好运行到消费者这里,那么就会跳出循环,会导致消费者函数已经结束
if not q.empty():
print('#############')
print('%s消费%s'%(name,a))
else:
break
def producter(name):
for i in range(10):
b='%s'%i
time.sleep(1)
q.put(b)
print('%s生成%s'%(name,b))
if __name__ == '__main__':
q=queue.Queue()
c = Thread(target=consumer,args=('顾客',))
p = Thread(target=producter,args=('生产者',))
p.start()
c.start()