一、多进程 与 多线程 的概念
1、进程的概念
进程是程序在计算机上的一次执行活动。当你运行一个程序,你就启动了一个进程。显然,程序是死的(静态的),进程是活的(动态的)。
进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,它们就是处于运行状态下的操作系统本身;
所有由你启动的进程都是用户进程。进程是操作系统进行资源分配的单位。
2、示例
PID 即进程ID(每个进程有唯一的PID号)
PPID 即父进程ID
3、进程 与 线程 的区别
进程:每个正在系统上运行的都是一个。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。
线程:线程是一组的集合,或者是程序的特殊段,它可以在程序里独立执行。
4、多进程 与 多线程 的区别
多线程使用的是cpu的一个核,适合io密集型
多进程使用的是cpu的多个核,适合运算密集型
5、Python 的多进程模块 (需要 import 导入该模块即可)
该模块支持子进程、通信、共享数据、执行不同形式的同步,提供了Process,Pipe, Lock等组件
import multiprocessing
二、多进程的相关操作
1、创建多进程
格式为 p = multiprocessing.Process(target=worker_1, args=(2, ))
其中:target 指定的是当进程执行时,需要执行的函数
args 当进程执行时,需要给函数传入的参数;args 必须是一个tuple,特别是当函数需要传输一个参数时,即 单个元素的元组表示方法 (1,)
p 代表的是一个多进程。
2、多进程的常用操作
p.is_alive() 判断进程是否存活,返回布尔值
p.run() 启动进程
p.start() 启动进程,会自动调用 run 方法,推荐使用该方法。
p.join(timeout) 等待子进程结束 或到超时时间
p.terminate() 强制子进程退出
p.name 进程的名字
p.pid 进程的PID
3、示例
import multiprocessing #导入多进程模块import time #导入时间模块def worker(args,interval): print("start worker {0}".format(args)) time.sleep(interval) #暂停时间:秒 print("end worker {0}".format(args))def main(): print("start main") p1 = multiprocessing.Process(target=worker,args=(1,1)) p2 = multiprocessing.Process(target=worker,args=(2,2)) p3 = multiprocessing.Process(target=worker,args=(3,3)) p1.start() p1.join(timeout=3) p2.start() p3.start() print("the number of CPU is {0}".format(multiprocessing.cpu_count())) for p in multiprocessing.active_children(): print("the name of active children is {0},{1} pid is alive".format(p.name,p.pid)) print("end main")if __name__ == '__main__': main()
运行结果
4、单个元素的元组表示方法 (1,)
三、多进程 的 组件——Lock 锁
1、锁的概念
如果有多个线程同时操作一个对象,如果没有很好地保护该对象,会造成程序结果的不可预期。于是 锁 的概念应运而生。
四、多进程 的 共享内存——Value 和 Array
1、python的multiprocessing模块也给我们提供了共享内存的操作
2、一般的变量在进程之间是没法进行通讯的,multiprocessing提供了Value和Array模块,他们可以在不通的进程中共同使用。