python3多进程实例详解

刚写完多线程的笔记没几天,可以看看我之前的多线程IO密集型操作实例详解:https://sulao.cn/post/609.html

多进程和多线程的区别在于,多线程是一组资源由所有子线程共享,当其中一个子线程修改共享资源的变量,那么所有子线程获取到的共享资源变量就会改变,当其中一个线程崩溃会导致整个进程崩溃,多进程拷贝资源变量到每个子进程进行各自处理各自的任务,不受其他进程的影响,多进程的劣势是创建进程资源开销大,运行的进程数量也是有限的,进程过多会导致任务调度都会出现问题

今天来把多进程也来做几个实例介绍下,本地目前没有这种场景,也是尽量写最简单最容易理解的例子给大家看看

首先我们来看看使用Pool批量创建进程池的例子

#!/usr/bin/python3
#coding:utf-8
from multiprocessing import Pool
import os,time

def run_task(i):
    print('Run task %s (pid:%s)...' % (i, os.getpid()))
    time.sleep(3)

if __name__ == "__main__":
    p = Pool(4)
    for i in range(5):
        p.apply_async(run_task, args=(i, ))
    p.close()
    p.join()
    print("process ending !")

线程池Pool的数量为CPU核心数,创建线程池的优势是在于一次性可以批量创建大量的子线程而避免在创建子线程上的等待时间,Pool调用join()方法等待所有子进程结束之前需要先调用close()方法,这个方式是用来防止在此以后创建新的进程

menu.saveimg.savepath20181228160759.jpg


由于fork在windows上无法使用,我们就只讲multiprocessing模块的使用,首先上代码:

#!/usr/bin/python3
#coding:utf-8
from multiprocessing import Process
import os,time

def run_task():
    print('Run task pid:%s , Parent pid:%s' % (os.getpid(), os.getppid()) )

if __name__ == "__main__":
    p = Process(target=run_task)
    p.start()
    p.join()
    print("Master pid:%s" % (os.getpid()))
    print("process ending !")

在子进程当中os.getpid获取当前进程ID,os.getppi获取父进程ID

menu.saveimg.savepath20181228173340.jpg

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://sulao.cn/post/614.html