开发者学堂课程【Python入门 2020年版:多进程的使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10470
多进程的使用
内容介绍
一、多进程的使用
二、举例说明
一、多进程的使用
1.进程
程序:例如 xxx.py 这是程序,是一个静态的。
进程: 一个程序运行起来后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单元。不仅可以通过线程完成多任务,进程也是可以的。
2.进程的状态
工作中,任务数往往大于cpu的核数,即定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态。
(1)就绪态:运行的条件都已经满足,正在等在 cpu 执行。
(2)执行态::cpu正在执行其功能。
(3)等待态:等待某些条件满足,例如一个程序 sleep 了,此时就处于等待态。
3.创建进程
multiprocessing 模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。
写法跟线程差不多
二、举例说明
1.代码:
import multiprocessing
def dance():
for i in range(100):
print
(‘正在跳舞’ )
def sing():
for i in range(100):
print
('正在唱歌')
#创建了两个进程
p1 . multiprocessing.Process(target=dance)
p2 . multiprocessing.Process(target=sing)
P1.start()
p2.start()
现在启动,在Windows平台会报错,mac不会,有个要求,Windows只能在直接运行时才能使用。
代码:
import multiprocessing
def dance():
for i in range(100):
print
(‘正在跳舞’ )
def sing():
for i in range(100):
print
('正在唱歌')
if _name_==
‘_main_’:
#创建了两个进程
p1 . multiprocessing.Process(target=dance)
p2 . multiprocessing.Process(target=sing)
P1.start()
p2.start()
加上“if _name_== ‘_main_’:”
表明直接运行这个文件时,下面的代码才会执行。
运行结果:
正在跳舞
正在跳舞
正在跳舞
......
正在唱歌
正在唱歌
......
连在一起的原因:100次跳舞 cpu 还没来得及切换就结束了
如何解决:加上time.sleep
import multiprocessing,time
def dance():
for i in range(100):
time.sleep(0.5)
print
(‘正在跳舞’ )
def sing():
for i in range(100):
time.sleep(0.5)
print
('正在唱歌')
if _name_==
‘_main_’:
#创建了两个进程
p1 . multiprocessing.Process(target=dance)
p2 . multiprocessing.Process(target=sing)
P1.start()
p2.start()
运行结果:
正在跳舞
正在唱歌
正在跳舞
正在唱歌
......
还有需要注意的,线程里也会出现,是一样的,即有参数的情况,要把参数传上去:
import multiprocessing,time
def dance(n):
for i in range(n):
time.sleep(0.5)
print
(‘正在跳舞’ )
def sing(m):
for i in range(m):
time.sleep(0.5)
print
('正在唱歌')
if _name_==
‘_main_’:
#创建了两个进程
#target 用来表示执行的任务
#args 用来传参,类型是一个元祖
p1 . multiprocessing.Process(target=dance,args=(20,))
p2 . multiprocessing.Process(target=sing,args=(50,))
P1.start()
p2.start()
运行结果:
正在跳舞
正在唱歌
正在跳舞
正在唱歌
......
注意:运行的进程在执行结束前可以在任务管理器的详细信息中看到它的 pid
打出它的pid,使用os模块
import multiprocessing,time,os
def dance(n):
for i in range(n):
time.sleep(0.5)
print
(‘正在跳舞’,pid={}.format(os.getpid())
)
def sing(m):
for i in range(m):
time.sleep(0.5)
print
('正在唱歌',pid={}.format(os.getpid())
)
if _name_==
‘_main_’:
Print
(‘主进程的pid={}’.format(os.getpid9())
)
#创建了两个进程
#target 用来表示执行的任务
#args 用来传参,类型是一个元祖
p1 . multiprocessing.Process(target=dance,args=(20,))
p2 . multiprocessing.Process(target=sing,args=(50,))
P1.start()
p2.start()
运行结果:
主进程的pid=5484
正在跳舞,pid=5936
正在唱歌,pid=10128
正在跳舞,pid=5936
正在唱歌,pid=10128
正在跳舞,pid=5936
正在唱歌,pid=10128
正在跳舞,pid=5936
正在唱歌,pid=10128
......
而且在任务管理器中可以把进程强制结束,主进程关掉,子进程还没打印完就会结束。
2.谷歌浏览器也是多进程运行:
有十个进程,再开一个百度网站就会多一个进程
想对比找出百度的 pid 是哪个,但是发现 pid 会变,只能尝试,发现结束5896,百度就会崩溃。主进程结束,就全部都会结束,但是结束一个子进程,不会影响其他进程。