五、python高级:线程

一、多线程执行

1、使用前先导入  form  threading  import  Thread

2、t = Thread( target = test )  创建线程

3、t.start( ) 启动线程

4、主线程会等待所有的子线程结束后才结束

五、python高级:线程

五、python高级:线程

5、通过Thread子类完成创建多线程

五、python高级:线程

 

二、线程共享全局变量

1、与进程不同,线程之间共享全局变量

五、python高级:线程

五、python高级:线程

   通过以上实例我们发现,经过两个子线程对全局变量 num 的修改,num 最终的值已经从 100 变成了 113,进一步证明了线程之间是共享全局变量的

 

2、由于线程之间共享全局变量,当子线程对全局变量进行操作时,可能会导致一些BUG的出现

五、python高级:线程

如图,经过两个子线程的运行,最终全局变量 g_num 的值应为2000000,但是运行结果如下:

五、python高级:线程

 

解决方法一: 主线程等待1秒后,再开启第二个线程

五、python高级:线程

五、python高级:线程

 

解决方法二:定义一个标志位,通过标志位状态来执行不同的线程

五、python高级:线程

五、python高级:线程

 

解决方法三:互斥锁

 ①当多个线程几乎同时修改某个共享数据时,需要进行同步控制,线程同步控制能够保证多个线程安全访问竞争资源,最简单的同步机制就是引入互斥锁,

②互斥锁为资源引入一个状态:锁定 / 非锁定

③某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他的线程不能更改,直到该线程释放资源,将资源状态改为“非锁定”,其他的线程才能再次锁定该资源,互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程操作下,数据的正确性

④互斥锁使用前先导入 

五、python高级:线程

五、python高级:线程

 

使用互斥锁时需要注意逻辑性,避免出现死锁

 

三、线程之间的局部变量不共享

1、

五、python高级:线程

如图,  threading.current_thread( ).name  可以获得线程名

 

2、

五、python高级:线程

我们发现,虽然两个线程都去同一个函数中执行任务,但是局部变量g_num并不共享