为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

欢迎各位小哥哥小姐姐阅读本的文章,对大家学习有帮助,请点赞加关注哦!!!!!!!!!!

您的点赞和关注将是我持续更新的动力呢.^v^

有不懂的问题可以私聊我哦!

问题:

  • 1、Python 多线程为什么耗时更长?
  • 2、为什么在 Python 里面推荐使用多进程而不是多线程?

1.1创建多线程

Python提供两个模块进行多线程的操作,分别是thread和threading,

前者是比较低级的模块,用于更底层的操作,一般应用级别的开发不常用。

  • 方法1:直接使用threading.Thread()
为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

  • 方法2:继承threading.Thread来自定义线程类,重写run方法
为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

1.2 线程合并

Join函数执行顺序是逐个执行每个线程,执行完毕后继续往下执行。主线程结束后,子线程还在运行,join函数使得主线程等到子线程结束时才退出。

为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

1.3 线程同步与互斥锁

线程之间数据共享的。当多个线程对某一个共享数据进行操作时,就需要考虑到线程安全问题。threading模块中定义了Lock 类,提供了互斥锁的功能来保证多线程情况下数据的正确性。

用法的基本步骤:

为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

其中,锁定方法acquire可以有一个超时时间的可选参数timeout。如果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理。

具体用法见示例代码:

为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

1.4 可重入锁(递归锁)

为了满足在同一线程中多次请求同一资源的需求,Python 提供了可重入锁(RLock)。

RLock内部维护着一个Lock和一个counter变量,counter 记录了 acquire 的次数,从而使得资源可以被多次 require。直到一个线程所有的 acquire 都被 release,其他的线程才能获得资源。

具体用法如下:

为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

1.5 守护线程

如果希望主线程执行完毕之后,不管子线程是否执行完毕都随着主线程一起结束。我们可以使用setDaemon(bool)函数,它跟join函数是相反的。它的作用是设置子线程是否随主线程一起结束,必须在start() 之前调用,默认为False。

1.6 定时器

如果需要规定函数在多少秒后执行某个操作,需要用到Timer类。具体用法如下:

为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

2 Python 多进程

2.1 创建多进程

Python 要进行多进程操作,需要用到muiltprocessing库,其中的Process类跟threading模块的Thread类很相似。所以直接看代码熟悉多进程。

  • 方法1:直接使用Process, 代码如下:
为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

  • 方法2:继承Process来自定义进程类,重写run方法, 代码如下:
为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

2.2 多进程通信

进程之间不共享数据的。如果进程之间需要进行通信,则要用到Queue模块或者Pipi模块来实现。

2.3 进程池

创建多个进程,我们不用傻傻地一个个去创建。我们可以使用Pool模块来搞定。

Pool 常用的方法如下:

为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

具体用法见示例代码:

为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?

选择多线程还是多进程?

在这个问题上,首先要看下你的程序是属于哪种类型的。一般分为两种 CPU 密集型 和 I/O 密集型。

  • CPU 密集型:程序比较偏重于计算,需要经常使用 CPU 来运算。例如科学计算的程序,机器学习的程序等。
  • I/O 密集型:顾名思义就是程序需要频繁进行输入输出操作。爬虫程序就是典型的 I/O 密集型程序。

如果程序是属于 CPU 密集型,建议使用多进程。而多线程就更适合应用于 I/O 密集型程序。

最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。

"


分享到:


相關文章: