进程的状态
在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。
单进程
import time
def dance():
for i in range(1,4):
print("我在跳舞",i)
time.sleep(2)
def sing():
for i in range(1,4):
print("我在唱歌",i)
time.sleep(2)
if __name__ == '__main__':
dance()
sing()
结果为:
多进程(两个进程同时执行)
import time
from multiprocessing import Process #导入进程的类
def dance():
for i in range(1,4):
print("我在跳舞",i)
time.sleep(2)
def sing():
for i in range(1,4):
print("我在唱歌",i)
time.sleep(2)
if __name__ == '__main__':
p1=Process(target=dance) #创建进程,target指向的值为函数
p2=Process(target=sing)
p1.start() #启动进程
p2.start()
结果为:
父、子进程
import time,os
from multiprocessing import Process #导入进程的类
xiaogou=10
def dance():
global xiaogou
xiaogou+=20
print("dance小狗",xiaogou)
for i in range(1,4):
print("我在跳舞",i,"子进程",os.getpid(),"父进程",os.getppid())
time.sleep(2)
def sing():
global xiaogou
xiaogou+=30
print("sing小狗",xiaogou)
for i in range(1,4):
print("我在唱歌",i,"子进程",os.getpid(),"父进程",os.getppid())
time.sleep(2)
if __name__ == '__main__':
print("主进程",os.getpid())
p1=Process(target=dance) #创建进程,target指向的值为函数
p2=Process(target=sing)
p1.start() #启动进程
p2.start()
结果为:
进程池
from multiprocessing import Pool
import os,time
def worker(name):
start=time.time()
print(name,"开始",start)
time.sleep(2)
end=time.time()
print(name,"结束",end,"执行了",end-start)
if __name__ == '__main__':
pool=Pool(3)
for i in range(7):
pool.apply(worker,args=(i+1,)) #把进程放到进程池
pool.close() #关闭,不允许在有新的进程进来
pool.join() #主进程阻塞,等待子进程结束
print("进程结束")
结果为:
迅雷下载器
from multiprocessing import Pool
import os,time
def downLoad(movie):
i = 0
while i<5:
print(movie,"下载了%.2f%%"%((i+1)/5*100))
time.sleep(2)
i=i+1
return movie+"下载完成"
def downOver(contnet):
print(contnet,"------")
if __name__ == '__main__':
po=Pool(3)
movieList=["西红柿首富","我不是药神","海绵宝宝","小猪佩奇","海王"]
for name in movieList: #启动进程downLoad,把电影名传入,下载完成后调用downOver函数,进行提示
po.apply_async(downLoad,args=(name,),callback=downOver)
po.close()
po.join()
结果为:
from multiprocessing import Queue,Process
import os,time
def shengChanZhe(q):
bzList=["小龙虾","韭菜鸡蛋","猪肉大葱","芹菜猪肉","三鲜","茴香"]
for bz in bzList:
print("包饺子",bz)
q.put(bz)
time.sleep(3)
def xiaoFeiZhe(q):
while True:
try:
b=q.get(block=False,timeout=2)
print("吃饺子",b)
time.sleep(2)
except:
print("滚蛋,哥不吃了")
break
if __name__ == '__main__':
q=Queue(6)
p1=Process(target=shengChanZhe,args=(q,))
p2=Process(target=xiaoFeiZhe,args=(q,))
p1.start()
p2.start()
结果为: