还没关注?
今天我们就来说说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