进程是正在执行中的应用程序,一个进程包含了该应用程序的所有信息。
计算机中多线程的操作已经可以实现多人物的处理机制了,但是如果涉及到多核CPU或者多个CPU的硬件主机,多进程并发编程的实现能比多线程并发机制更加有效的利用和发挥硬件资源优势。
进程类型中的属性和方法
os
getpid(): 获取进程编号
getppid():获取父进程编号
Process
name:进程名称
ident:进程编号
daemon:是否守护进程,默认False
start():启动进程
run():进程执行方法
terminate():结束进程
is_alive():判断进程是否存活
join():独占模式,当前的进程执行结束后才会执行下一个进程
基本语法:
面向函数的操作:多进程
面向类型的操作:多进程
如果对于进程的状态管理并不是特别精确,只是需要多个进程工作。则可以使用进程池
进程池:{Process Pool}
进程池:存放多个进程
Python进程池,可以直接申请多个进程,提交你的任务即可
创建一个进程池:pool = multiprocessing.Pool(2) #表示一个存放2个进程的进程池存在了
pool.apply_async(my_func)
池塘.处理任务(函数,参数)->通过池塘中的进程执行
#多进程的两种实现
import multiprocessing,time,os
def my_func():
print(multiprocessing.current_process().name,"一个进程正在工作",os.getpid(),os.getppid())
time.sleep(1)
if __name__ == "__main__":
#进程池里面存放了两个进程
pool = multiprocessing.Pool(2)
for i in range(20):
pool.apply_async(my_func)
#停止提交任务
pool.close()
#独占执行
pool.join()
apply(function,args)同步执行一个函数~当进程中的函数执行完成才能退出
apply_async(function,args)异步非阻塞执行一个函数
close()停止向进程池提交任务
注意:如果主进程退出之前,进程池没有停止提交任务,该进程就无法申请内存去运行;所以时一个无效的进程池,直接退出。
join()让进程池工作完成,才能允许其他进程继续工作
进程中的数据处理问题
- 多个进程,都能读取到全局变量的值。
- 多个进程使用的全局变量的值不是共享的,只是在各自的进程中复制了一份。
进程中的数据共享:
1. 通过第三方的东西进行交互
a) A进程将数据存储到文件|数据库中
b) B进程从文件|数据库中读取数据
c) 文件/数据库是独立于A和B进程之外的第三方,能被A|B同时访问
2. 通过第三方,独立于进程之外的数据类型完成进程之间的数据共享
Python提供了几种方案:
a) 事件对象multiprocessing.Event进程之间的状态标记
b) multiprocessing模块中提供了条件类型Condition,可以完成多个进程之间的通信
c) multiprocessing模块中提供了一个数据操作类型Queue,可以完成进程之间的数据通信
multiprocessing.Queue进程队列
get()从队列中获取数据
get_nowait()从对列中获取数据,非阻塞
put()向队列中添加数据
put_nowait()向队列中添加数据,非阻塞
empty()判断队列是否为空
full()判断队列是否已满
qsize()获取队列中元素的个数
d ) multiprocessing提供了一个专门用来进行多个进程之间数据共享的类型:Manager
m = multiprocessing.Manager()
备注:可以在本地多个进程之间完成数据共享和通信,可以在网络上远程的两个主机之间实现数据共享和通信
用于数据共享:存储数据
Array:数组
list:创建一个存储数据的列表
a = multiprocessing.Manager.list()
dict:创建一个存储数据的字典
b = multiprocessing.Manager.dict()
Value:创建一个存储数据的变量
c = multiprocessing.Manager.Value(‘count’,100)
type a:
manager = Manager()
my_list = manager.list()
my_dict = manager.dict()
my_value = manager.Value(‘count’,100)
type b:
with Manager() as manager:
my_list = manager.list()
my_dict = manager.dict()
my_value = manager.Value(‘count’,100)
3. 数据通信进程管理
Lock/RLock:进程锁
Barrir:进程同步对象
Semaphore|bOUNDEsEMAPHORE