python学习之多进程

在介绍多进程之前,首先介绍下操作系统获取关于进程中的一些信息

方法 描述
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,在这是需要注意的是,如果传入的参数只有一个,就需要在参数后面添加一个,至于startjoin方法用途可以查看下面的表。通过调用os.getpid()是获取当前执行的进程的pid。通过图可以看到父进程pid是23888,子进程pid是24540
在这里插入图片描述

Process属性方法介绍

方法 描述
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类中提供的一些方法
Python进程池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.')

执行结果如下图所示
在这里插入图片描述

发布了54 篇原创文章 · 获赞 9 · 访问量 1216

猜你喜欢

转载自blog.csdn.net/qq_29983883/article/details/105471265