进程的概念:
- 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。
- 进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
- 进程是操作系统中最基本、重要的概念。是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上。
进程和线程的对比:
- 进程是资源分配的基本单位,线程是CPU调度的基本单位;
- 进程运行需要独立的内存资源,线程需要的是必不可少的一点资源;
- 进程切换慢,线程切换快;
- 线程不能独立运行,必须运行在进程中(进程能提供资源);
- CPU密集型,进程优先,IO密集型使用线程;
python中进程的操作
process模块是一个创建进程的模块,借助这个模块,就可以完成进程的创建。
1)进程的使用
import multiprocessing import time def work1(): for i in range(10): print("正在运行work1.....", i, "子进程编号:", multiprocessing.current_process().pid) time.sleep(0.5) if __name__ == '__main__': process_obj = multiprocessing.Process(target=work1, name="p1") print("主进程编号:", multiprocessing.current_process().pid) process_obj.start()
2)进程参数的传递
import multiprocessing import time def work1(a, b, c): print("参数:", a, b, c) for i in range(10): print("正在运行work1....") time.sleep(0.5) if __name__ == '__main__': # 1.args传递元祖 # process_obj = multiprocessing.Process(target=work1, args=(1, 2, 3)) # 2.kwargs传递字典 # process_obj = multiprocessing.Process(target=work1, kwargs={"a": 1, "b": 2, "c": 3}) # 3.args与kwargs混合传递 process_obj = multiprocessing.Process(target=work1, args=(1,), kwargs={"c": 3, "b": 2}) process_obj.start()
3)进程间全局变量不能共享
import multiprocessing import time g_num = 0 def work1(): global g_num for i in range(10): g_num += 1 print("work1.....", g_num) # 10 def work2(): print("work2.....", g_num) # 0 if __name__ == '__main__': p1 = multiprocessing.Process(target=work1) p2 = multiprocessing.Process(target=work2) p1.start() p2.start() time.sleep(2) print("主进程....", g_num) # 0
4)进程的守护
import multiprocessing import time def work(): for i in range(10): print("子进程运行中....", i) time.sleep(0.5) if __name__ == '__main__': p = multiprocessing.Process(target=work) # 进程守护:子进程与主进程的一种约束,当主进程结束时,子进程也随之结束。 p.daemon = True p.start() time.sleep(2) exit() print("xxxxxx")
二、进程池
进程池:是一个进程的容器,可以自动帮我们创建指定数量的进程,并管理进程及工作。
import multiprocessing import time def copy_file(): print("正在copy文件....", multiprocessing.current_process()) time.sleep(0.5) if __name__ == '__main__': # 创建线程池 pool = multiprocessing.Pool(3) for i in range(10): # 以进程池同步的方式copy文件 # pool.apply(copy_file) # 如果以进程池异步的方式copy文件,需做两步操作 # 1) pool.close() 表示不再接收新的任务 # 2)主进程不在等待进程池执行结束后再退出,需要进程池join() pool.apply_async(copy_file) pool.close() pool.join()