从零开始的多进程生活 - Python

距离上次更新呢…已经过了好久好久了,这里还是要解释一下为什么会拖更。

在这里插入图片描述
因为懒。

在这里插入图片描述

解释完毕!

然后让我们开始愉快的学习吧~

哦,对了,我们是学Python的多进程哦。

传统:介绍

我们先来了解一下,什么是多任务:

在这里插入图片描述
就像这只猫一样,她正在一边扭动身躯,一边挥舞荧光棒,这两件事是同时做的,所以叫多任务。

这一点呢,相信各位都知道,所以就不多bb啦~

那么为什么要用多任务呢,咱们一个一个来不好吗???

其实呀,这也是为了能把CPU,也就是处理器的性能发挥到极致,毕竟花了钱的嘛,也不能让她只发挥那么一丢丢性能,能同时处理很多很多很多条信息的处理器,才是好处理器!

也就是说,同一时间内执行多个任务,就是多任务喽~

一边打游戏一边聊QQ一边聊微信,同时勾搭十个妹纸,快哉。

在这里插入图片描述
但是有个问题

我们不是同时勾搭的,用词错误了。

虽然切屏切的够快,但还是会有那么零点几秒的间隙,所以,我们是并发的!

什么是并发?

就是我们打游戏聊QQ,想要聊QQ就要停下打游戏,想要打游戏就要抛弃女朋友,所以!

并发,不是真正的同时进行。

在这里插入图片描述

也就是说,并发是执行了多个任务,但是这些任务是交替执行的,也就是说可以提高效率,但终究不是真正意义上的同时

为什么会感觉是同时呢,还是因为切屏切的太快啦~

同样的,CPU处理的还是比较快的,切换来切换去的,给我们的感觉就是同时进行,所以如果任务数量大于CPU能同时处理的数量的时候,就是并发

那么,有没有真正意义上的同时进行呢?

有的!

她叫并行!

听名字就能听出来吧,是两个人一起走,平行线,注定不会在一起。

有的时候,缘分就是这样,错过了,就是两道平行线。

在这里插入图片描述
但是,分开对大家都有好处,你干你的我干我的,大家互不相干,不影响,不拖累!

实现了真正意义上的同时

传统:介绍X2

感觉一个目录下面写太多,看起来就比较乱吧,所以换一个目录写,任性~

在这里插入图片描述
说完多任务,还有多任务里面的并发并行,我们再来说一说什么是进程

就比如说,我们之前一边打游戏一边聊QQ一边聊微信,这里面有几个进程呢?

答案是三个!

第一个进程:游戏

第二个进程:QQ

第三个进程:微信

那如果再加一个一边看小电影呢?

那就是四个!

第四个进程:看小电影

但是啊,进程只是一个坑位。

在这里插入图片描述
就好比有的人占着坑不xx,进程也是可以光开着但是不干事的,就比如你挂着QQ,啥也没干,但是进程就在那里摆着,哪怕什么都没干,也是一个进程。

也就是运行中的程序就是一个进程!

但是哦,一个软件不一定是一个进程,而是最起码有一个进程!

就比如说我们执行Python函数的时候,是按照代码从上往下执行的,也就是只有一个进程,得按顺序来。

但是如果有两个进程呢?

就可以把其中的一部分任务分给进程A,其他的任务分给进程B,这样他们就能同时执行,效率也是大大的提高啦~

在这里插入图片描述

def funcA():
	print('我是任务A')

def funcB():
	print('我是任务B')

funcA()
funcB()

就比如上面的两个函数,如果我们正常运行,只会开一个进程,先执行funcA()然后执行funcB()。

但是如果我们开两个进程,也就是第一个进程是默认开的,是主进程,我们再开的进程就是子进程,这两个函数就可以同时执行。

这,就是进程!

说这些呢,不是为了让大家马上就掌握,而是先了解~

莫急,莫急!

在这里插入图片描述

如何利用多进程提高效率

既然我们已经知道了,多开一个进程是可以提高效率的,那么问题就来了:怎么多开一个进程?

接下来,我们就要学习,多开一个进程!

在这里插入图片描述

首先呢,还是要导入我们的多进程模块呗~

import multiprocessing

这个玩意是自带的哦,不用再单独安装啦。

然后我们就要创建一个进程对象!

# 创建进程对象
process_1 = multiprocessing.Process()

这个process_1是我自己起的名字哦,你们也可以起别的,后面的是不能改的,调用多进程包里的Process函数。

那么,这个进程对象里面,要放什么呢?

第一个参数,target,放的是我们的任务,也就是函数名字!

注意,是名字哦,不带括号的~

# 导入进程模块
import multiprocessing
# 导入time里面的sleep,方便看到效果
from time import sleep

def funcA():
    for i in range(3):
        print('我是任务A')
        sleep(0.5)

def funcB():
    for i in range(3):
        print('我是任务B')
        sleep(0.5)

# 不带这个,会报错
if __name__ == '__main__':

    # 创建进程对象
    process_A = multiprocessing.Process(target=funcA)
    process_B = multiprocessing.Process(target=funcB)

那么既然创建了进程对象,我们就要启动她吧,启动!

	# 启动进程并执行任务
    process_A.start()
    process_B.start()

直接调用进程模块里的start()方法,就可以啦~

你有多少个函数,就创建多少个进程对象,就可以做到同时执行!

这样你就可能会问了,那我该怎么往函数里面传参呢???

莫急!

往下看呗~

在这里插入图片描述

如何给多进程传参

先假设一种情况:

def funcA(url):
    for i in range(3):
        print(url)
        sleep(0.5)

def funcB(url):
    for i in range(3):
        print(url)
        sleep(0.5)

在这种情况下呢,我们需要往两个函数里面传入一个url,她才能正常的执行。

但是我们之前的多进程方法是没有传参的,连括号都没有,还怎么传???

所以啊,接下来我们就来解决传参的这个问题!

第一种方法:用元组传参!

	# args表示用元组传参,既然是元组,就一定要有个逗号,不然只是一个括号而已
    process_A = multiprocessing.Process(target=funcA,args=('hello',))

这句话的意思呢,就是开启了一个进程,绑定了funcA这个函数,往里面传了一个hello的字符串。

切记,如果是元组的话,而且只有一个值的情况下,一定要加个逗号!

第二种方法:用字典传参!

	# kwargs表示用字典传参,跟函数的参数名字一一对应
    process_B = multiprocessing.Process(target=funcB,kwargs={'url':'hi'})

这里的url呢,就是我们函数里面写好的url,一一对应,如果函数里面是别的,这里的url也要改成别的!

# 导入进程模块
import multiprocessing
# 导入time里面的sleep,方便看到效果
from time import sleep

def funcA(url):
    for i in range(3):
        print(url)
        sleep(0.5)

def funcB(url):
    for i in range(3):
        print(url)
        sleep(0.5)

# 不带这个,会报错
if __name__ == '__main__':

    # 创建进程对象
    # args表示用元组传参,既然是元组,就一定要有个逗号,不然只是一个括号而已
    process_A = multiprocessing.Process(target=funcA,args=('hello',))
    # kwargs表示用字典传参,跟函数的参数名字一一对应
    process_B = multiprocessing.Process(target=funcB,kwargs={'url':'hi'})

    # 启动进程并执行任务
    process_A.start()
    process_B.start()

这样,我们就完成了不但可以给函数开进程,而且还能传参!

在这里插入图片描述
注意:元组是按顺序传参,字典是按键名传参

敢不敢点进来看一看

没了,完了。

在这里插入图片描述
下一期咱们讲线程!!!

那,那个…点赞的事…就拜托各位姥爷辣!!!

在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值