既然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))
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 既然python的多线程是"伪多线程",那么多线程访问共享资源的时候,还需要线程锁吗