还没关注?

今天我们就来说说Python中的多进程多线程编程模式。

01多线程工作

在开始讲今天的课文之前,先介绍一个概念“多线程工作”,可能有人听说过,也可能有人在平时的工作中做过。我再给你讲讲这个概念。所谓“多线程”,就是同时做几件事。

以我个人的工作为例,当我用Sql运行数字时,数据是不能一次导出的。我会在一个屏幕上显示Sql的运行进度,在另一个屏幕上做一会PPT。Sql出来后,我会快速切换到处理刚导出的数据。有时数据量很大,用Excel打开文件可能需要几分钟。这个时候Excel正在运行,我在Excel上做不了别的。我会去微信处理别人的问题。文件打开后,我会快速切换到Excel继续下一步处理。我输入一个公式后,Excel可能需要等待一段时间,所以这个时候我可以做别的事情。

如你所见,我不是等一件事完全做完再去做另一件事,而是在不同的事情之间快速切换,这可以算是一种“多线程工作”。

多线程可以减少你的等待时间,大大提高你的工作效率。

多进程和多线程

理解了“多线程工作”之后,开始进入今天的话题,编程多线程多进程。在上面的例子中,Sql运行可以看作一个流程,PPT也可以看作一个流程,Excel处理数据或者一个流程。

进程下还有一个更小的单元,就是线程。一个进程由几个线程组成。Sql运行过程可以由几个线程组成,比如写Sql、运行Sql、导出数据。同样,PPT制作的过程可以由定义主题、选择模板、列出大纲、丰富页面等几个线程组成。

线程是程序执行的最小单位,一个进程可以由一个或多个线程组成,每个线程也是交叉执行的。

这里需要注意的是,多进程/多线程不能同时做几件事情,而是跨不同的事情,先做任务A一段时间,然后强行停止,再做任务B一段时间,然后停止,再做任务c,之所以感觉每个任务都在同时进行,是因为任务之间的切换速度足够快,所以看起来像是多个任务同时在进行。

让我们来看看两个概念:

并行:指多个指令同时在多个处理器上执行;

并发:指同时只能执行一条指令,但多条进程指令快速循环执行,使得多个进程可以同时执行的宏效果。

当一个以上的人同时做多项工作时,多项工作是并行的,当一个人交替做多项工作时,多项工作是并发的。在计算机中是同一个概念,计算机中CPU核的数量相当于人的数量,在计算机是单核多任务时是并发的;当一台计算机是多核的,并且大于任务数时,就是并行的。

目前计算机的主流配置是四核/八线程,但实际任务数大多在四个以上,需要交替执行特定任务,即并发执行。

操作我的电脑

以上是对多线程和多进程的简单通俗的理解。这里就不放一些官方的解释了。有兴趣可以网上查。

多进程多线程如何提高效率

假设做任务A需要一个小时,做任务B需要一个小时,做任务c需要一个小时,当我们每做一个任务20分钟,就切换到另一个任务,那么完成三个任务所需要的总时间就不会变,不仅不会变,还可能会增加,因为在不同任务之间切换是要付出代价的,因为当你从一个任务切换到另一个任务的时候,你很可能不记得你刚刚在哪里做的,你需要花时间去思考。如果是这样,为什么要用多进程/多线程的方法来处理任务呢?我在第一节提到“多线程”可以减少你的等待时间,大大提高你的工作效率。

是因为在实际工作中,等待的地方很多,比如等待Excel打开,等待Sql用完数据。处理多进程/多线程任务的方法就是充分利用这些等待时间。充分利用你的大脑和电脑的中央处理器。如果没有等待时间,多进程/多线程任务处理可能不如单线程任务处理。

如何实现多进程多线程

在了解了什么是多进程、多线程以及如何提高处理任务的效率之后,我们进入了硬干货部分,即具体的多进程/多线程如何实现多任务的“同时”处理。

有几种方法可以实现多任务处理:

1.多进程模式

2.多线程模式

3.多进程+多线程

同时执行多个任务,通常不是互不相关,而是需要相互沟通协调。有时,任务1必须等待任务2完成后才能继续执行,有时任务3和任务4不能同时执行。因此,多进程多线程程序的复杂度远远高于之前编写的单进程单线程程序。

4.1多流程模式

多进程是指一次启动多个进程,每个进程只有一个线程,但多个进程可以一起执行多个任务。一般进程数就是CPU内核数。当您的计算机是四核时,您的计算机进程默认为4。

4.1.1参数详细说明

在Python中,我们使用多进程包多处理来处理多进程任务。多处理模块提供一个进程类来表示一个进程对象。

#过程参数

多重处理。进程,kwargs={},*,守护进程=无)

#分组

#target表示调用对象,即函数

#name表示进程的别名

#args表示调用对象的位置参数元组,即函数的参数

#kwargs表示调用对象的字典

#流程通用方法

Close关闭进程

_alive进程正在运行吗

Join等待join语句执行之前的所有程序继续运行,这通常用于进程之间的同步

Start进程准备就绪,等待CPU调度

Run strat调用Run方法。如果在实例化进程时没有传入目标参数,star将执行默认的run方法

#处理公共属性

工艺流程标识

命名流程名称

4.1.2建立子流程

以下示例演示了启动一个子流程并等待其完成:

从多重处理导入进程

importos

#由子进程def run_proc执行的代码:

打印... '% ))

if__name__=='__main__ ':

print)#用于获取主进程的进程id

P = process #实例化process p,调用run_proc函数,传入参数对象args

打印

P.start#流程准备就绪

P.join#后续操作将在所有流程执行完毕后执行

打印

运行结果如下:

过程开始...

我刚刚创建了一个childprocess 。

我是儿童程序,我的父母是876。

子过程实际上与调用单个函数是一样的。

4.1.3建立多个子流程

建立多个子流程意味着多个功能随机同步运行。

建立多流程有两种方式,一种是直接使用流程建立多个子流程,如下:

从多重处理导入进程

重要随机时间

defdo_task:

打印)

time.sleep)

defwrite_task:

打印)

time.sleep)

if__name__ == "__main__ ":

p1 =进程)

p2 =进程)

p1.start

p2.start

输出结果是:

我在做PPT

我在写Sql

上面的代码表示两个进程同时启动,两个进程调用不同的函数,也就是做不同的任务。而且,上面只有两个任务。当任务很多的时候,如果用上面的方法创建多个进程,需要实例化多个进程对象,写多行p.start比较麻烦。聪明的前辈肯定不会用这么笨的方法,所以有一个进程池。

多重处理。pool = pool# process是进程数

以上两个流程由一个流程池表示,结果如下:

导入多重处理

随机导入,时间

def do_task:

打印)

time.sleep)

def write_task:

打印)

time.sleep)

if__name__ == "__main__ ":

func_list=

args_list=

pool =多处理。泳池

forfunc,args infunction _ list,args_list:

pool.apply_async

打印“等待所有子流程完成”...'

pool.close

Pool.join #在调用join之前,一定要先调用close函数,否则会出现错误。

打印“所有子流程完成”。'

输出结果如下:

等待所有子流程完成...

我在做PPT

我在写Sql

所有子流程完成。

4.2多线程模式

多线程模式是一次只启动一个进程,但是这个进程可以启动多个线程,这样多个线程就可以一起执行多个任务。在Python中,我们要借助线程模块来启动多线程,用来启动多线程的模块也有_thread模块,但是线程模块封装了_thread模块,比较高级,所以我们一般使用线程模块。

4.2.1参数详细说明

Threading模块中的Threading类用于启动多线程,构造中使用的参数和方法与Process中的基本相同,大家可以看看,这里就不赘述了。

#参数

线程,kwargs={})

#方法

isAlive

获取/设置名称获取/设置线程名称

开始

join

4.2.2创建线程

创建线程就是调用函数。

导入时间,线程

defdo_chioce:

打印)

time.sleep)

if__name__ == "__main__ ":

T =穿线。线程)

t.start

输出结果是:

我选择PPT模板

4.2.3创建多线程

创建多个线程意味着调用多个函数。

导入时间,线程

defdo_chioce:

打印)

time.sleep)

defdo_content:

打印)

time.sleep)

if__name__ == "__main__ ":

T1 =线程。线程)

T2 =线程。线程)

t1.start

t2.start

输出结果是:

我选择PPT模板

我在概述PPT

4.3多进程+多线程

多进程+多线程是一次启动多个进程,每个进程启动多个线程,所以会同时执行很多任务。但是模型比较复杂,不推荐使用。

1.《python多进程 轻松实现Python中的多进程与多线程》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《python多进程 轻松实现Python中的多进程与多线程》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/caijing/1789301.html