五、python高级:线程
一、多线程执行
1、使用前先导入 form threading import Thread
2、t = Thread( target = test ) 创建线程
3、t.start( ) 启动线程
4、主线程会等待所有的子线程结束后才结束
5、通过Thread子类完成创建多线程
二、线程共享全局变量
1、与进程不同,线程之间共享全局变量
通过以上实例我们发现,经过两个子线程对全局变量 num 的修改,num 最终的值已经从 100 变成了 113,进一步证明了线程之间是共享全局变量的
2、由于线程之间共享全局变量,当子线程对全局变量进行操作时,可能会导致一些BUG的出现
如图,经过两个子线程的运行,最终全局变量 g_num 的值应为2000000,但是运行结果如下:
解决方法一: 主线程等待1秒后,再开启第二个线程
解决方法二:定义一个标志位,通过标志位状态来执行不同的线程
解决方法三:互斥锁
①当多个线程几乎同时修改某个共享数据时,需要进行同步控制,线程同步控制能够保证多个线程安全访问竞争资源,最简单的同步机制就是引入互斥锁,
②互斥锁为资源引入一个状态:锁定 / 非锁定
③某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他的线程不能更改,直到该线程释放资源,将资源状态改为“非锁定”,其他的线程才能再次锁定该资源,互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程操作下,数据的正确性
④互斥锁使用前先导入
使用互斥锁时需要注意逻辑性,避免出现死锁
三、线程之间的局部变量不共享
1、
如图, threading.current_thread( ).name 可以获得线程名
2、
我们发现,虽然两个线程都去同一个函数中执行任务,但是局部变量g_num并不共享