编程语言应用

注册

 

发新话题 回复该主题

Python语言基础多进程和多线程的 [复制链接]

1#

多CPU和多核时代的到来,使得计算机中的进程、线程可以实现并行。而为了提高程序的执行效率,充分利用计算机的处理能力,我们需要了解让程序同时执行多个任务的“并发编程”技能。

1.什么是进程和线程?

2.多线程的特点

3.Python中的多进程

4.Python中的多线程

5.多任务编程的选择

1.什么是进程和线程?

常见的解释是:进程是操作系统分配资源的单位,线程是调度的基本单位,线程之间共享进程资源。

进程和线程是CPU工作时间的的描述,是执行过程的时间切片,但不那么细究,简单一点可以想为:进程就是操作系统(OS)中执行的一个程序,然后系统会以进程为单位分配存储空间。而一个进程可以拥有多个并发的相互竞争CPU调度资源的执行单元,这就是所谓的线程。由于同一个进程下的线程共享着上下文环境(除CPU执行外的执行环境),于是这些线程间的通行比进程间通行会更加容易。进程间不相影响,而线程挂掉则会导致所在进程中断。

2.多线程的特点

单线程是所有的待处理事项都得按顺序执行,一个部分没处理完其他的就得一直等着排队,而多线程的并发编程能围绕主线程同时执行多个任务,它能避免线程阻塞,以提高软件可响应性和程序的执行效率。

当然世上没有免费的午餐,多线程也不是没有坏处。毕竟计算机的处理能力是固定的,不会说因为用了并发编程就突破了计算机的处理能力上限。一方面,多线程的程序会抢占其他的程序的CPU执行时间;另一方面,多线程程序的编写和调试具有更高的难度。

3.Python中的多进程

Python既支持多进程又支持多线程。以Windows系统为例,Python通过导入multiprocessing模块中的Process类来创建子进程。

以下面这个例子演示Python多进程差别:

fromrandomimportrandintfromtimeimporttime,sleepdefdownload_task(filename):time_to_download=randint(1,5)sleep(time_to_download)print(%s耗费了%d秒%(filename,time_to_download))defmain():start=time()download_task(过程1)download_task(过程2)end=time()print(总共耗费了%.2f秒.%(end-start))if__name__==__main__:main()

最后得到的运行结果为,过程1花费4秒,过程2花费3秒,总的花费时间不低于两个过程花费时间之和。

上面的代码执行了两轮函数download_task,是按顺序进行执行,等过程1执行完再执行过程2。下面的代码加了多进程操作,看看有何区别。

Process对象通过start方法来启动程序,不然程序会停在那;通过join方法让进程参与进来。target参数传入一个函数来表示进程启动后要执行的代码(函数),args则是这个函数的待传入参数(注意是个元组,用圆括号将参数值和一个逗号一起括起来)。

frommultiprocessingimportProcessfromosimportgetpidfromrandomimportrandintfromtimeimporttime,sleepdefdownload_task(filename):print(进程号[%d].%getpid())time_to_download=randint(1,5)sleep(time_to_download)print(%s耗费了%d秒%(filename,time_to_download))defmain():start=time()p1=Process(target=download_task,args=(过程1,))p1.start()p2=Process(target=download_task,args=(过程2,))p2.start()p1.join()p2.join()end=time()print(总共耗费了%.2f秒.%(end-start))if__name__==__main__:main()加了多进程后的运行结果,过程1花费4秒,过程2花费5秒,总的花费时间一定低于两个过程花费时间之和。两个进程有部分是重合且同时执行的。

购买专栏解锁剩余63%
分享 转发
TOP
发新话题 回复该主题