案例11
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import threading
sum = 0
loopSum = 10000000
def myAdd():
global sum, loopSum
for i in range(1,loopSum):
sum += 1
def myMinu():
global sum, loopSum
for i in range(1, loopSum):
sum -= 1
if __name__ == '__main__':
print("String%s"%sum)
t1 =threading.Thread(target = myAdd, args=())
t2 =threading.Thread(target = myMinu, args=())
t1.start()
t2.start()
t1.join()
t2.join()
print("ALL Done%s"%sum)
解决变量:锁(lock)
- 是一个标志,表示一个线程在占用一些资源
- 使用共享资源,放心的用
- 取消锁,释放锁
- 理解锁:锁其实不是锁住谁,而是保证多线程任务不会互相干扰。
案例12
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import threading
sum = 0
loopSum = 100000
lock = threading.Lock()
def myAdd():
global sum, loopSum
for i in range(1,loopSum):
lock.acquire()
sum += 1
lock.release()
def myMinu():
global sum, loopSum
for i in range(1, loopSum):
lock.acquire()
sum -= 1
lock.release()
if __name__ == '__main__':
print("String%s"%sum)
t1 =threading.Thread(target = myAdd, args=())
t2 =threading.Thread(target = myMinu, args=())
t1.start()
t2.start()
t1.join()
t2.join()
print("ALL Done%s"%sum)
死锁问题,func_1和FANC_2互相锁死胃
案例14
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import threading
import time
lock_1 = threading.Lock()
lock_2 = threading.Lock()
def func_1():
print("func_1 starting.......")
lock_1.acquire()
print("func_1 request lock_1")
time.sleep(2)
print("func_1等待 lock_2")
lock_2.acquire()
print("func_1申请了 lock_2")
lock_2.release()
print("func_1 释放了lock_2")
lock_1.release()
print("func_1释放了lock_1")
print("all func_1 done~~~~~")
def func_2():
print("func_2 starting.......")
lock_2.acquire()
print("func_2request lock_1")
time.sleep(4)
print("func_2等待 lock_2")
lock_1.acquire()
print("func_2申请了 lock_2")
lock_1.release()
print("func_2 释放了lock_1")
lock_2.release()
print("func_2释放了lock_2")
print("all func_2 done~~~~~")
if __name__ == "__main__":
print("main hs start~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`")
t1 = threading.Thread(target=func_1, args=())
t2 = threading.Thread(target=func_2, args=())
t1.start()
t2.start()
t1.join()
t2.join()
print("主程序启动~~~~~~~~~~~~~~~~~~~~")
案例V15
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import threading
import time
lock_1 = threading.Lock()
lock_2 = threading.Lock()
def func_1():
print("func_1 starting.......")
lock_1.acquire(timeout=4)
print("func_1 request lock_1")
time.sleep(2)
print("func_1等待 lock_2")
rst = lock_2.acquire(timeout= 2)
if rst:
print("func_1已经等到锁lock_2")
lock_2.release()
print("func_1 释放了lock_2")
else:
print("func_1注定没申请到Lock_2")
lock_1.release()
print("func_1释放了 Lock_1")
print("func_1 done~~~~~~~")
def func_2():
print("func_2 starting.......")
lock_2.acquire()
print("func_2request lock_1")
time.sleep(4)
print("func_2等待 lock_2")
lock_1.acquire()
print("func_2申请了 lock_2")
lock_1.release()
print("func_2 释放了lock_1")
lock_2.release()
print("func_2释放了lock_2")
print("all func_2 done~~~~~")
if __name__ == "__main__":
print("main hs start~~~~~~~~~~~~~~~~~~~~~~~~~~~~~`")
t1 = threading.Thread(target=func_1, args=())
t2 = threading.Thread(target=func_2, args=())
t1.start()
t2.start()
t1.join()
t2.join()
print("主程序启动~~~~~~~~~~~~~~~~~~~~")
semphore
- 允许一个资源最多由几个多线程问题同时使用。
案例V16
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#__author__ = DrYao
import threading
import time
semaphore = threading.Semaphore(3)
def func():
if semaphore.acquire():
for i in range(5):
print(threading.currentThread().getName()+ "get semaphore")
time.sleep(15)
semaphore.release()
print(threading.currentThread().getName() + "release semaphore")
for i in range(8):
t1 = threading.Thread(target= func)
t1.start()
threading.Timer
案例17
可重新入锁
- 一个锁,可以被一个线程多次申请
- 主要解决递归调用的时候,需要申请锁的情况
案例18