既然python的多线程是"伪多线程",那么多线程访问共享资源的时候,还需要线程锁吗
最近处理的大多数任务都是基于python的多线程实现的,然而使用python逃避不开的一个话题就是,python的GIL(的全称是 Global Interpreter Lock)全局解释器锁是单线程的,那么是不是意味着python的多线程也是串行的?多线程对共享资源的使用就不需要锁(线程锁)了?
笔者一开始也是这么误解:
既然python解释器的锁是单线程的===》那么经过解释器生成的线程,是轮训执行的(相当于单线程)===》然后推断出线程访问共享资源的时候不需要加线程锁?
既然不需要加线程锁,那么python为什么会存在线程锁?这明显是一个矛盾的问题,以上推论纯属YY,上述结论是不正确的。
其实上述推断从第二步就开始错误了,其实某些时候,看似合理的推断,是完成不成立的。
先做个小demo看一下效果,下面代码很简单,线程方法内部轮训设置全局变量递增,然后其多个线程调用该方法,线程方法在操作全局变量的时候暂时不适用线程锁
#! /usr/bin/python # -*- coding: utf-8 -*- from threading import Thread,Lock g_var = 0 lock = Lock() def thread_tasks(): for i in range(100000): global g_var #lock.acquire() g_var = g_var+1 #lock.release() if __name__ == "__main__": t_list = [] for i in range(100): t = Thread(target=thread_tasks, args=[]) t_list.append(t) for t in t_list: t.setDaemon(True) t.start() for t in t_list: t.join() print("thread execute finish") print("global variable g_var is " + str(g_var))