在进入主题之前,我们先学习一下并发和并行的概念:
--并发:在操作系统中,并发是指一个时间段中有几个程序都处于启动到运行完毕之间,且这几个程序都是在同一个处理机上运行。但任一时刻点上只有一个程序在处理机上运行。形象的点描述:一个人做很多事情,但同一时刻只能做一件事情。
--并行:当系统有一个CPU时,则程序的操作有可能非并发。当一个CPU执行一个程序时,另一个CPU可以执行另一个程序,两个程序互不抢占CPU资源,可以同时进行。形象的描述:多人同时做多件事情
可能有小伙伴又会问串行又是什么鬼呢?再来唠叨一下:
串行和并行是数据传输方式的区别。其实和并发和并行的概念是两个领域:
1、数据传输方式不同,串行口传输方式为数据排成一行,一位一位送出,接受也是一样。并行口传输8位数据一次送出。
2、针脚不同,串行口针脚少,并行口针脚多
3、用途不同,串行口现在只用作控制接口,并行口多用作打印机、扫描仪等接口。
来吧,进入正题:
进程的概念:计算机程序其实只是存储在磁盘上可执行的二进制(或其他可执行的类型)文件。只有把它们加载到内存中并被操作系统调用,才算是被执行,并用拥有生命周期。所以说进程是一个执行中的程序。
每个进程都拥有自己的地址空间,内存,数据栈以及其他用于跟踪执行的辅助数据。
此间,操作系统管理其上的所有进程的执行,并为这些进程合理分配时间。
多进程:那就是在一个多核的电脑上同时运行多个程呗,其实是实现并行。
但是呢,我们先从多线程学习起。多线程搞定了,多进程也就是小意思了。
在此之前先介绍一个概念,之后会用到。GIL锁,有可能大家会听到别人说python运行很慢啥的,其实就是这个GIL锁的原因,那它到底是个啥呢:
GIL全局解释性锁,python在设计的时候,还没有多核处理器的概念。因此,为了设计的方便和线程的安全,python之父就设计了一个锁。这个锁要求,任何一个进程中,同时只能有一个线程在执行。因此并不能多个线程分配多个CPU资源。所以python中的线程只能实现并发,而不能实现真正的并行,这就是python所线程的局限性。在python3中GIL锁进行了该井,在遇到任何IO阻塞(不是耗时)的时候,会自动切换线程,这就使得在进行多IO操作的时候python的锁多线程有很大的优势。同时一个线程在运行时间或者运行步骤达到一定的阈值时,也会自动的切换线程。
对比于多进程,多线程其实是实现并发的操作,在在python中使用multiprocessing包实现多进程:
首先来看下多线程的实现,这里使用的是threading包。用sleep模拟耗时操作:
1 importtime2 importthreading3
4 defget_detail_html(url):5 print("starting get detail html")6 time.sleep(4)7 print("ending get detail html")8
9 defget_detail_url(url):10 print("starting get detail url")11 time.sleep(2)12 print("ending get detail url")13
14 if __name__ == '__main__':15 thread1 = threading.Thread(target=get_detail_html, args=("",))16 thread2 = threading.Thread(target=get_detail_url, args=("",))17 start_time =time.time()18 thread1.setDaemon(True)
19 thread2.setDaemon(True)
20 thread1.start()21 thread2.start()22 print(123456)23 thread1.join()
24 thread2.join()
25 print("using time: {}".format(time.time()-