本文目录一览:
Python多线程是什么意思
几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,所有运行中的任务都对应一个进程。即当一个程序进入内存运行时,即变成一个进程。进程就是处于运行过程中的程序,并且具有一定的独立功能。进程是系统进行资源分配调度的一个独立单位,当一个程序运行时,内部可能包含多个顺序执流,每个顺序执行流就是一个线程。
1、线程在程序中是独立的,并发的执行流,划分尺度小于进程,所有多线程程序的并发性高;
2、进程在执行过程中拥有独立的内存单元,而多个线程共享内存,可以极大地提高进程程序的运行效率;
3、线程比进程具有更高的性能,由于同一个进程中的线程都有共性,多个线程共享同一个进程的虚拟空间,可以很容易实现通信。操作系统在创建进程中,必须为该进程分配独立内存空间,分配大量相关资源,但创建线程则简单得多。
Python高阶(一) - 单线程、多线程和多进程的效率对比测试
多线程的目的 - “最大限度地利用CPU资源”。每个程序执行时都会产生一个进程,而每一个进程至少要有一个主线程。对于单CPU来说(没有开启超线程),在同一时间只能执行一个线程,所以如果想实现多任务,那么就只能每个进程或线程获得一个时间片,在某个时间片内,只能一个线程执行,然后按照某种策略换其他线程执行。由于时间片很短,这样给用户的感觉是同时有好多线程在执行。
Python是运行在解释器中的语言,查找资料知道,python中有一个全局锁(GIL),在使用多线程(Thread)的情况下,不能发挥多核的优势。而使用多进程(Multiprocess),则可以发挥多核的优势真正地提高效率。
单线程、多线程和多进程的效率对比测试: github地址
资料显示,如果多线程的进程是CPU密集型的,那多线程并不能有多少效率上的提升,相反还可能会因为线程的频繁切换,导致效率下降,推荐使用多进程;如果是IO密集型,多线程进程可以利用IO阻塞等待时的空闲时间执行其他线程,提升效率。所以我们根据实验对比不同场景的效率
| CPU密集型操作| IO密集型操作| 网络请求密集型操作
-- | -- | --| --
线性操作| 69.73533328374 |17.76633326213 | 6.78833333651
多线程操作| 75.40299995740 |145.68366670609 | 1.93999997775
多进程操作| 13.97433336576 | 4.67833328247| 2.38333328565
仅个人观点,,欢迎留言~~~
python多线程能提高效率吗
如果你的代码是CPU密集型,多个线程的代码很有可能是线性执行的。所以这种情况下多线程是鸡肋,效率可能还不如单线程因为有context switch
但是:如果你的代码是IO密集型,多线程可以明显提高效率。例如制作爬虫(我就不明白为什么Python总和爬虫联系在一起…不过也只想起来这个例子…),绝大多数时间爬虫是在等待socket返回数据。这个时候C代码里是有release GIL的,最终结果是某个线程等待IO的时候其他线程可以继续执行。
反过来讲:你就不应该用Python写CPU密集型的代码…效率摆在那里…
如果确实需要在CPU密集型的代码里用concurrent,就去用multiprocessing库。这个库是基于multi process实现了类multi thread的API接口,并且用pickle部分地实现了变量共享。
再加一条,如果你不知道你的代码到底算CPU密集型还是IO密集型,教你个方法:
multiprocessing这个module有一个dummy的sub module,它是基于multithread实现了multiprocessing的API。
假设你使用的是multiprocessing的Pool,是使用多进程实现了concurrency
from multiprocessing import Pool
如果把这个代码改成下面这样,就变成多线程实现concurrency
from multiprocessing.dummy import Pool
两种方式都跑一下,哪个速度快用哪个就行了。
UPDATE:
刚刚才发现concurrent.futures这个东西,包含ThreadPoolExecutor和ProcessPoolExecutor,可能比multiprocessing更简单