多进程
Posted jsnhdream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多进程相关的知识,希望对你有一定的参考价值。
多进程
同一时刻并行的处理多个任务,即为多进程。比如,你一边喝茶、看书还听着音乐。真正的并行多任务只能在多核的CPU上实现,由于任务数量是远远多于CPU的核数,所以操作系统会自动将多任务短时间轮流切换执行,给我们的感觉就像同时在执行一样。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。编写的代码没有运行叫程序,正在运行的代码就是进程。
fork
Python中可以使用os模块fork()函数来创建子进程。程序执行os.fork()时,操作系统会创建一个子进程,然后复制父进程的所有信息到子进程中;调用一次os.fork()时,会返回两次值。返回给子进程的值一定是0,返回给父进程的是子进程中的pid号。返回给父进程pid(子进程的)号,是因为父进程可以fork出多个子进程,所以有必要记住子进程的pid号。
import os print("当前进程pid= %d"% os.getpid()) num = 0 pid = os.fork() if pid == 0: print("我是子进程: %s,父进程是:%s"%(os.getpid(),os.getppid())) num += 1 print("num = %d"%num) else: print("我是父进程:%s,我的子进程是:%s"%(os.getpid(),pid)) num += 1 print("num = %d"%num) print("父、子进程都可以执行") 输出: 当前进程pid= 4262 我是父进程:4262,我的子进程是:4263 num = 1 父、子进程都可以执行 我是子进程: 4263,父进程是:4262 num = 1 父、子进程都可以执行
多进程中,每个进程都各自拥有一份,互不影响,如上num = 1。
multiprocessing
由于fork函数存在于Linux、Unix、Mac操作系统中,Windows操作系统无fork函数调用,Python作为一个跨平台的语言,使用multiprocessing模块封装fork函数来创建多进程。multiprocessing提供一个Process类来代表一个进程对象。
Process使用:
Process([group [, target [, name [, args [, kwargs]]]]])
target:表示这个进程实例所调用对象;
args:表示调用对象的位置参数元组;
kwargs:表示调用对象的关键字参数字典;
name:为当前进程实例的别名;
group:大多数情况下用不到;
Process类常用方法:
is_alive():判断进程实例是否还在执行;
join([timeout]):是否等待进程实例执行结束,或等待多少秒;
start():启动进程实例(创建子进程);
run():如果没有给定target参数,对这个对象调用start()方法时,就将执行对象中的run()方法;
terminate():不管任务是否完成,立即终止;
Process类常用属性:
name:当前进程实例别名,默认为Process-N,N为从1开始递增的整数;
pid:当前进程实例的PID值;
from multiprocessing import Process import os import time def run_proc(name,age,**kwargs): for i in range(10): print(‘子进程运行中,name= %s,age=%d,pid=%d‘%(name,age,os.getpid())) print(kwargs) time.sleep(1) if __name__ == ‘__main__‘: print(‘父进程 %d‘%os.getpid()) p = Process(target=run_proc,args=(‘MI‘,18),kwargs={‘S‘:99}) print(‘将要执行子进程‘) p.start() time.sleep(2) p.terminate() p.join() print(‘子进程结束了‘) 输出: 父进程 4460 将要执行子进程 子进程运行中,name= MI,age=18,pid=4461 {‘S‘: 99} 子进程运行中,name= MI,age=18,pid=4461 {‘S‘: 99} 子进程结束了
以上是关于多进程的主要内容,如果未能解决你的问题,请参考以下文章