前言:
python多进程,经常在使用,却没有怎么系统的学习过,官网上面讲得比较细,结合自己的学习,整理记录下官网:https://docs.python.org/3/library/multiprocessing.html
multiprocessing简介
multiprocessing是python自带的多进程模块,可以大批量的生成进程,在服务器为多核CPU时效果更好,类似于threading模块。相对于多线程,多进程由于独享内存空间,更稳定安全,在运维里面做些批量操作时,多进程有更多适用的场景
multiprocessing包提供了本地和远程两种并发操作,有效的避开了使用子进程而不是全局解释锁的线程,因此,multiprocessing可以有效利用到多核处理
Process类
在multiporcessing中,通过Process类对象来批量产生进程,使用start()方法来启动这个进程
1.语法
multiprocessing.Process(group=None,target=None,name=None,args=(),kwargs={},*)
group: 这个参数一般为空,它只是为了兼容threading.Tread target: 这个参数就是通过run()可调用对象的方法,默认为空,表示没有方法被调用 name: 表示进程名 args: 传给target调用方法的tuple(元组)参数 kwargs: 传给target调用方法的dict(字典)参数2.Process类的方法及对象
run()
该方法是进程的运行过程,可以在子类中重写此方法,一般也很少去重构
start()
启动进程,每个进程对象都必须被该方法调用
join([timeout])
等待进程终止,再往下执行,可以设置超时时间
name
可以获取进程名字,多个进程也可以是相同的名字
is_alive()
返回进程是否还存活,True or False,进程存活是指start()开始到子进程终止
daemon
守护进程的标记,一个布尔值,在start()之后设置该值,表示是否后台运行
注意:如果设置了后台运行,那么后台程序不运行再创建子进程
pid
可以获取进程ID
exitcode
子进程退出时的值,如果进程还没有终止,值将是None,如果是负值,表示子进程被终止
terminate()
终止进程,如果是Windows,则使用terminateprocess(),该方法对已经退出和结束的进程,将不会执行
以下为一个简单的例子:
#-*- coding:utf8 -*- import multiprocessingimport timedef work(x): time.sleep(1) print time.ctime(),'这是子进程[{0}]...'.format(x)if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=work,args=(i,)) print '启动进程数:{0}'.format(i) p.start() p.deamon = True
当然也可以显示每个进程的ID
#-*- coding:utf8 -*- import multiprocessingimport timeimport osdef work(x): time.sleep(1) ppid = os.getppid() pid = os.getpid() print time.ctime(),'这是子进程[{0},父进程:{1},子进程:{2}]...'.format(x,ppid,pid)if __name__ == '__main__': for i in range(5): p = multiprocessing.Process(target=work,args=(i,)) print '启动进程数:{0}'.format(i) p.start() p.deamon = True
新闻热点
疑难解答