在介绍多进程之前,首先介绍下操作系统获取关于进程中的一些信息
方法 | 描述 |
---|---|
os.getpid() | 获取当前进程的pid |
os.getppid() | 获取当前进程的父进程的pid |
创建单进程
在python中,我们一般都是通过引入multiprocessing模块来实现多进程编程,multiprocessing模块提供了一个Process类来实现一个进程对象。
Process(target,name,args,kwargs)
- target:表示调用对象,即子进程要执行的任务
- name:子进程名称
- args:表示调用的位置参数元祖,
- kwargs:表示调用对象的字典
Process调用的返回的是一个进程实例,下面首先通过一个样例来展示多进程的用处
from multiprocessing import Process
import os
# 子进程要执行的代码
def run_proc(name):
print('Run child process %s (%s)...' % (name, os.getpid()))
if __name__=='__main__':
print('Parent process %s.' % os.getpid())
p = Process(target=run_proc, args=('test',))
print('Child process will start.')
p.start()
p.join()
print('Child process end.')
执行结果如下图所示,在上面程序中首先通过调用Process类产生一个进程实例,并指定该进程执行任务时run_proc
函数,传入的参数是test
,在这是需要注意的是,如果传入的参数只有一个,就需要在参数后面添加一个,
至于start
和join
方法用途可以查看下面的表。通过调用os.getpid()
是获取当前执行的进程的pid。通过图可以看到父进程pid是23888,子进程pid是24540
方法 | 描述 |
---|---|
start() | 启动进程,调用进程中的run()方法 |
terminate() | 强制终止进程,不会进行任何清理操作。如果该进程终止前,创建了子进程,那么该子进程在其强制结束后变为僵尸进程 |
is_alive() | 判断某进程是否存活,存活返回True,否则False |
join([timeout]) | 主线程等待子线程终止。timeout为可选择超时时间;需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程 |
run() | 进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法 |
创建多进程
上面介绍了如果只创建单个进程的方法,如果同时创建多个进程,使用上面的方式则显得有点累赘。这里multiprocessing模块就提供了Pool类,用于创建进程池,使用进程池的好处就是通过进程池容易对多个进程进行管理。
Pool(numprocess,initializer,initargs)
- numprocess:要创建的进程数,默认为cpu_count()的值
- initializer:是每个工作进程启动时要执行的可调用对象,默认为None
- initargs:是要传给initializer的参数组
通过调用Pool类返回的是一个Pool实例,下表是Pool类中提供的一些方法
方法 | 描述 |
---|---|
apply_async(func[, args=()[, kwds={}[, callback=None]]]) | |
from multiprocessing import Pool
import os, time, random
def long_time_task(name):
print('Run task %s (%s)...' % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print('Task %s runs %0.2f seconds.' % (name, (end - start)))
if __name__=='__main__':
print('Parent process %s.' % os.getpid())
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print('Waiting for all subprocesses done...')
p.close()
p.join()
print('All subprocesses done.')
执行结果如下图所示