2018.10.16Python_25_多线程共享变量会产生的问题

http://www.runoob.com/python3/python3-multithreading.html参考资料

案例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

猜你喜欢

转载自blog.csdn.net/weixin_42879237/article/details/83069867