创建进程就是为了执行多任务代码
多任务就是操作系统可以同时运行多个任务
代码没有在运行的时候叫程序,
代码在运行的时候交做进程
时间片轮转
并发:任务数量大于核心数,两个或多个时间在同一时间间隔发生
并行:任务数量小于或等于核心数,两个或多个时间在同一时间发生
进程的创建-multiprocessing
multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程,可以理解为一个独立的进程,可以执行另外的事情
Process创建进程
函数用法:
from multiprocessing import Process
import os
from time import sleep
#age元组形式传递参数,**kwargs字典形式传入
def run_proc(name,age,**kwargs):
for i in range(10):
print('子进程运行中,name=%s,age=%d,pid=%d'%(name,age,os.getpid()))
print(kwargs)
sleep(0.2)
if __name__ == '__main__':
#创建一个进程对象
p = Process(target=run_proc,args=('text',18),kwargs={"m":20})
#开始执行
p.start()
# sleep(1)
# p.terminate() #1秒后不管任务是否完成,立即终止子程序
p.join(0.2) #等待子程序执行0.2秒后执行
print('---main---')
类用法:
from multiprocessing import Process
from time import sleep
#类继承Process
class NewProcess(Process):
def __init__(self,name,age):
super(NewProcess,self).__init__()
self.name = name
self.age = age
def run(self):
while True:
print("---1---%s,%s"%(self.name,self.age))
sleep(1)
if __name__ == '__main__':
#传递参数
p = NewProcess("aa",15)
p.start()
sleep(5)
p.terminate()
print("主进程结束...")
POOL进程池
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法
from multiprocessing import Pool
import os
def worker(num):
for i in range(5):
print("pid:%d,num:%d"%(os.getpid(),num))
if __name__ == '__main__':
#最多有3个进程一起执行
pool = Pool(3)
for i in range(10):
print("%d"%i)
#向进程池添加任务
pool.apply_async(worker,(i,))
#关闭进程池,相当于不能够再次添加新的任务
pool.close()
#主进程 创建/添加 任务后,主进程默认不会等待进程池中的任务执行完后才结束
#而是当主进程的任务做完后,立马结束
#如果这个地方没join会导致进程池中的任务不会执行
pool.join()
fork进程
fork只能在linux中运行,windows中不支持
主进程返回值大于0
子进程返回值等于0
os.getpid() 当前进程标识,标识就是进程识别码
os.getppid() 父进程标识
import os
#res有两个值,一个0,一个大于0的值
res=os.fork()
if res>0:
print(父进程:%d%os.getpid())
else:
print('子进程:%d,他的父进程是:%d%(os.getpid(),os.getppid()))
1.如果主进程先退出了,说明进程已经退出了,不会因为子进程没有结束,主进程等待
2.全局变量在多个进程中不共享
fork的4个进程
执行到1和2分别去执行11和22
import os
import time
ret = os.fork()
if ret == 0:
print(---1---)
else:
print(---2---)
ret = os.fork()
if ret == 0:
print(---11---)
else:
print(---22---)
结果:
---1---
---11---
---22---
---2---
---11---
---22---
fork3个进程
import os
ret=os.fork()
if ret==0:
print("---1---")
else:
ret=os.fork()
if ret==0:
print("---11---")
else:
print("---22---")
网友评论