多线程threading,线程锁的运用

多线程的实现

  对多个已有的方法实现多线程

  例子:

python多线程的lock python多线程线程锁_线程锁

 

 使用多线程之后

python多线程的lock python多线程线程锁_面向对象_02

 

 面向对象创建多线程

面向对象地抽象线程需要自定义一个类继承Thread类。比如自定义class MyThread(threading.Thread)。这个类的一个实例就是代表了一个线程,

然后通过重载这个类中的run方法(是run,不是start!!但start的动作确实就是调用run)来执行具体的操作。此时锁可以作为一个构造方法的参数,将一个锁传进不同的实例中以实现线程锁控制。比如:

python多线程的lock python多线程线程锁_python多线程的lock_03

 


线程锁

 

当线程多线程运行时,如果一个参数被同时调用,就会造成这个参数紊乱,输出的值错误,这个时候为了保证一个线程在调用该参数时,其他线程不被运行调用,直到被释放为止,因此引入了线程锁的概念。

 

Gil(全局解释器锁)cpython环境下自带这一把锁,最初是为了能够适应多核电脑,进行多线程运算,为了保持数据一致,从而加了这么一个锁来解决该问题。

python多线程的lock python多线程线程锁_多线程_04

 

 

python多线程的lock python多线程线程锁_多线程_05

 

 

使用线程锁之后( run 和 start前后)

python多线程的lock python多线程线程锁_python多线程的lock_06

 


 

python多线程的lock python多线程线程锁_面向对象_07

 

 

线程锁直接放在默认__init__中不可以,可能是运行程序时,都是这一把锁,从而导致了10个线程都能调用,因为线程锁都指向同一个地址。放在外部,就是传参实例化时,指向分别不同的t1,t2.