距离上次更新呢…已经过了好久好久了,这里还是要解释一下为什么会拖更。
解释完毕!
然后让我们开始愉快的学习吧~
哦,对了,我们是学Python的多进程哦。
我们先来了解一下,什么是多任务:
就像这只猫一样,她正在一边扭动身躯,一边挥舞荧光棒,这两件事是同时做的,所以叫多任务。
这一点呢,相信各位都知道,所以就不多bb啦~
那么为什么要用多任务呢,咱们一个一个来不好吗???
其实呀,这也是为了能把CPU,也就是处理器的性能发挥到极致,毕竟花了钱的嘛,也不能让她只发挥那么一丢丢性能,能同时处理很多很多很多条信息的处理器,才是好处理器!
也就是说,同一时间内执行多个任务,就是多任务喽~
一边打游戏一边聊QQ一边聊微信,同时勾搭十个妹纸,快哉。
我们不是同时勾搭的,用词错误了。
虽然切屏切的够快,但还是会有那么零点几秒的间隙,所以,我们是并发的!
什么是并发?
就是我们打游戏聊QQ,想要聊QQ就要停下打游戏,想要打游戏就要抛弃女朋友,所以!
并发,不是真正的同时进行。
也就是说,并发是执行了多个任务,但是这些任务是交替执行的,也就是说可以提高效率,但终究不是真正意义上的同时。
为什么会感觉是同时呢,还是因为切屏切的太快啦~
同样的,CPU处理的还是比较快的,切换来切换去的,给我们的感觉就是同时进行,所以如果任务数量大于CPU能同时处理的数量的时候,就是并发。
那么,有没有真正意义上的同时进行呢?
有的!
她叫并行!
听名字就能听出来吧,是两个人一起走,平行线,注定不会在一起。
有的时候,缘分就是这样,错过了,就是两道平行线。
但是,分开对大家都有好处,你干你的我干我的,大家互不相干,不影响,不拖累!
实现了真正意义上的同时!
感觉一个目录下面写太多,看起来就比较乱吧,所以换一个目录写,任性~
说完多任务,还有多任务里面的并发和并行,我们再来说一说什么是进程!
就比如说,我们之前一边打游戏一边聊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()
这样,我们就完成了不但可以给函数开进程,而且还能传参!
没了,完了。
那,那个…点赞的事…就拜托各位姥爷辣!!!