为什么有人说 Python 的多线程是鸡肋?不是真正意义上的多线程?
作者:互联网
欢迎各位小哥哥小姐姐阅读本<python教程入门学习>的文章,对大家学习有帮助,请点赞加关注哦!!!
您的点赞和关注将是我持续更新的动力呢.v
有不懂的问题可以私聊我哦!
问题:
- 1、Python 多线程为什么耗时更长?
- 2、为什么在 Python 里面推荐使用多进程而不是多线程?
1.1创建多线程
Python提供两个模块进行多线程的操作,分别是thread和threading,
前者是比较低级的模块,用于更底层的操作,一般应用级别的开发不常用。
- 方法1:直接使用threading.Thread()
- 方法2:继承threading.Thread来自定义线程类,重写run方法
1.2 线程合并
Join函数执行顺序是逐个执行每个线程,执行完毕后继续往下执行。主线程结束后,子线程还在运行,join函数使得主线程等到子线程结束时才退出。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架微♥信:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~
1.3 线程同步与互斥锁
线程之间数据共享的。当多个线程对某一个共享数据进行操作时,就需要考虑到线程安全问题。threading模块中定义了Lock 类,提供了互斥锁的功能来保证多线程情况下数据的正确性。
用法的基本步骤:
其中,锁定方法acquire可以有一个超时时间的可选参数timeout。如果设定了timeout,则在超时后通过返回值可以判断是否得到了锁,从而可以进行一些其他的处理。
具体用法见示例代码:
1.4 可重入锁(递归锁)
为了满足在同一线程中多次请求同一资源的需求,Python 提供了可重入锁(RLock)。
RLock内部维护着一个Lock和一个counter变量,counter 记录了 acquire 的次数,从而使得资源可以被多次 require。直到一个线程所有的 acquire 都被 release,其他的线程才能获得资源。
具体用法如下:
1.5 守护线程
如果希望主线程执行完毕之后,不管子线程是否执行完毕都随着主线程一起结束。我们可以使用setDaemon(bool)函数,它跟join函数是相反的。它的作用是设置子线程是否随主线程一起结束,必须在start() 之前调用,默认为False。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架微♥信:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~
1.6 定时器
如果需要规定函数在多少秒后执行某个操作,需要用到Timer类。具体用法如下:
2 Python 多进程
2.1 创建多进程
Python 要进行多进程操作,需要用到muiltprocessing库,其中的Process类跟threading模块的Thread类很相似。所以直接看代码熟悉多进程。
- 方法1:直接使用Process, 代码如下:
- 方法2:继承Process来自定义进程类,重写run方法, 代码如下:
2.2 多进程通信
进程之间不共享数据的。如果进程之间需要进行通信,则要用到Queue模块或者Pipi模块来实现。
2.3 进程池
创建多个进程,我们不用傻傻地一个个去创建。我们可以使用Pool模块来搞定。
Pool 常用的方法如下:
具体用法见示例代码:
选择多线程还是多进程?
在这个问题上,首先要看下你的程序是属于哪种类型的。一般分为两种 CPU 密集型 和 I/O 密集型。最后,如果你的时间不是很紧张,并且又想快速的python提高,最重要的是不怕吃苦,建议你可以架微♥信:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~
- CPU 密集型:程序比较偏重于计算,需要经常使用 CPU 来运算。例如科学计算的程序,机器学习的程序等。
- I/O 密集型:顾名思义就是程序需要频繁进行输入输出操作。爬虫程序就是典型的 I/O 密集型程序。
如果程序是属于 CPU 密集型,建议使用多进程。而多线程就更适合应用于 I/O 密集型程序。
最后多说一句,小编是一名python开发工程师,这里有我自己整理了一套最新的python系统学习教程,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小编,并在后台私信小编:“01”即可领取。
标签:怕吃苦,Python,鸡肋,python,线程,进程,多线程 来源: https://blog.csdn.net/zihong523/article/details/121270456