7、线程、进程、协程进阶篇
1.1.继上一讲,知道了如何创建多线程和GIL的原理,接下来要说的是线程锁,那为什么需要线程锁呢? 先看下图,此图来自:http://www.cnblogs.com/alex3714/articles/5230609.html,我就不自己动手画了,比我画得好 分析: (1)线程1拿到count=0并获得GIL,依次执行1,2,3,4,5,然后执行时间到了释放GIL (2)线程2拿到count=0并获得GIL,依次执行6,7,8,9,10,11,修改count的值,此时count的值由0变成1,并释放GIL (3)线程1再次拿到GIL并继续执行12,13,修改count的值,count的值还是1 问题出现了:线程1和线程2都把count+1,但是最后count的值还是1 线程锁:cpu在执行任务时,在线程之间是进行随机调度的,并且每个线程在执行一段时间之后会切换到另外一个线程,但是由于线程之间堆数据是共享的,所以就会有可能出现上述问题。 没加锁时的代码: # -*- coding: utf-8 -*- #__author:jiangjing #date:2018/2/4 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time NUM = 0 def func(): global NUM