什么是线程?看完这篇文章你就懂了!

什么是线程?看完这篇文章你就懂了!

0 引子

这是一篇基础复习文档, 在写 python 脚本的时候, 确实感觉到 python 基础不扎实导致代码在运行时, 老是出现一些基础性的错误。因此决定接下来的一段时间对 python 的基础知识进行学习和巩固。

注意: 由于 python2 将会在不久之后失去支持, 官方也更推荐学 python3, 因此以下所有的知识点都是在 python3 上进行实践与学习。以下的 python 都可以默认为是 python3, 如果提到 python2 我会表明是 python2。

这篇是对 python 线程进行学习。

1 线程

线程是程序执行的最小单元, 通常一个进程中会包含有多个线程。

2 多线程

python 标准库提供了 _thread 和 threading 两个模块进行线程操作。threading 是一个更高级的模块, 它对 _thread 模块进行了封装。

先看一个创建一个线程并启动它的基本操作,启动一个线程就是把函数传入并创建 Thread 实例, 然后通过 start 方法执行。

什么是线程?看完这篇文章你就懂了!

结果如下

什么是线程?看完这篇文章你就懂了!

在程序执行时, 默认为启动一个进程用来执行程序, 而每个进程中都包含了至少一个线程。这个线程我们称之为主线程, 所以最开始程序获取当前线程名称时, 打印出来的为「MainThread」。之后再程序中, 创建了一个新线程, 并设置新线程的名字为「LoopThread」,当线程创建完毕后, 启动新线程, 并在主线程中设置与新线程同步。

前面提到, 一个进程中可以存在多个线程, 这些线程它们的内存是共享的, 也就是说, 在进程中设置了一个变量, 那么进程中的所有线程都可以获取并修改这个变量的值, 因此就会存在一个问题:如果多个进程同时修改一个变量的值, 那么就很容易将这个变量的值改乱掉。可以实际看一个例子:

什么是线程?看完这篇文章你就懂了!

我们定义了一个变量 balance, 并在 change_it 函数中对这个变量进行了操作, 根据逻辑, 不论怎么操作, 变量的值都应该是 0, 因为其加减操作都是相同的数。接着我们创建了两个线程, 这两个线程都会对变量进行操作, 理论上来说, 最终结果应该是 0,执行下程序你会发现, 结果并不等于0, 这就是由于多个线程可以同时操作一个变量, 导致在一个线程执行没全部执行完(即balance 变成0)之前, 另外一个线程对变量进行了修改, 导致变量值被改变, 最终越改越乱。

为了避免上述情况的发生, 需要给 change_it 函数上一把锁, 让变量的操作变得完整。例如当 线程1 获得锁之后, 线程2 就不能执行 change_it 函数, 只有当锁被 线程1 释放的时候, 线程2 才能获得锁, 运行 change_it 函数。这样就避免上冲突

什么是线程?看完这篇文章你就懂了!

锁保证了被锁的程序能从头到尾被执行, 不会出现程序执行到一半, 被其他线程干扰的情况。

3 ThreadLocal

在多线程环境下,每个线程都有自己的数据,这些数据与之前的全局数据不同,这些数据都是线程内部才能访问到的数据,修改这些不会与其他线程出现冲突。但是局部数据也存在问题,当线程需要通过其他函数来对自己的数据进行时,需要将数据作为参数传递出去,而如果是多层调用,那么这个数据就要被传递多次,非常麻烦。

python 中使用了 ThreadLocal 来解决这个问题,

什么是线程?看完这篇文章你就懂了!

通过 ThreadLocal 对象,将每个线程不同的 student 变量保存,在使用时, ThreadLocal 会根据不同的线程取出对应的 student 对象。

最后:

小编推荐一个Python学习交流群,由于是个新群,人数较少,望各位见谅。欢迎各位Python大佬、Python小白、想学Python的朋友加入,一起交流,分享与学习。群号571799375!!

本文来自网络,如有侵权,请联系小编删除!

猜你喜欢

转载自blog.csdn.net/weixin_44020598/article/details/85122341