python的线程锁详解编程语言

1、先看一个例子,一个进程可以起多个线程,多个线程都共享这个线程的内存 
 
import threading 
import time 
 
num = 100 
thread_lock = threading.Lock() 
''' 
def add_func(): 
    global num 
    print("Begin--->",num) 
    num -= 1 
    # thread_lock.release() 
''' 
#上面这段代码的结果,如果起100个线程去执行这个函数,那么第一个线程执行完后nun为99,这个时候第二个线程去拿num,拿到的值就是99,第三个线程拿到的值就是98....... 
 
''' 
def add_func(): 
    global num 
    print("Begin--->", num) 
    time.sleep(0.1) 
    num -= 1 
''' 
#上面这段代码的意思是,因为第一个线程和第二个线程之间有sleep,sleep后才去进行减操作,所以所有线程拿到的num的值都是100,最终执行的结果不是100-1,而是num-1,而这个num 
#就是上一个线程执行完后的num的,所以我们看到所有线程拿到的值都是100,但是最后num的值确实0 
 
#老师也没有讲清楚,上面的例子不加锁,结果也一直是正确的,但是在python2中,有时候会得到不一样的值,但是在python3则一直不会报错,为了避免出问题,我们可以对这个操作加锁 
 
lock = threading.Lock() 
#创建一个锁的实例 
 
def add_func(): 
    global num     #获取公共变量num 
    print("Begin--->", num) 
    time.sleep(1) 
    print("after--->",num) 
 
    #对下面的语句加锁或者获取一把锁,也就是同一个时间只有个线程可以执行下面的语句 
    lock.acquire() 
    num -= 1 
    # lock.release() 
    #用完之后就必须要释放锁,不然程序无法往下执行 
 
 
 
 
thread_list = [] 
for i in range(100): 
    t = threading.Thread(target=add_func) 
    t.start() 
    time.sleep(1) 
    thread_list.append(t) 
 
for t in thread_list: 
    t.join() 
 
print("over--->",num) 

  

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20883.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论