python基础知识学习——多进程编程

本文介绍了Python中的多进程编程,包括进程的定义、层次结构、并发现象,详细讲解了multiprocessing模块,如进程的开启、互斥锁、进程通信(Queue、Pipe、Managers)以及进程池的使用。通过实例展示了如何在Python中实现进程间的同步和数据共享,帮助理解Python多进程的优势和应用场景。
摘要由CSDN通过智能技术生成

1.什么是进程

进程是系统中正在运行的一个程序,程序一旦运行就是进程。

进程可以看成程序执行的一个实例。进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间通信,比如管道,文件,套接字等。

一个进程可以拥有多个线程,每个线程使用其所属进程的栈空间。线程与进程的一个主要区别是,统一进程内的一个主要区别是,同一进程内的多个线程会共享部分状态,多个线程可以读写同一块内存(一个进程无法直接访问另一进程的内存)。同时,每个线程还拥有自己的寄存器和栈,其他线程可以读写这些栈内存。

2.进程的层次结构

无论UNIX还是windows,进程只有一个父进程,不同的是:

1. 在UNIX中所有的进程,都是以init进程为根,组成树形结构。父子进程共同组成一个进程组,这样,当从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员。

2. 在windows中,没有进程层次的概念,所有的进程都是地位相同的,唯一类似于进程层次的暗示,是在创建进程时,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是父进程有权把该句柄传给其他子进程,这样就没有层次了。

3.进程并发的现象

进程并发的实现在于,硬件中断一个正在运行的进程,把此时进程运行的所有状态保存下来,为此,操作系统维护一张表格,即进程表(process table),每个进程占用一个进程表项(这些表项也称为进程控制块)

4.multiprocessing模块介绍

multiprocessing模块包含一个API,它基于threading API可以在多个进程中划分工作。由于Python全局解释器锁,python无法利用多个内核,我们可以通过multiprocessing来代替threading来利用多个CPU内核,进而解决计算瓶颈。
multiprocessing的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

Process类的参数介绍 描述
group 参数未使用,值始终为None
target 表示调用对象,即子进程要执行的任务
args 表示调用对象的位置参数元组。如果没有参数,则为一个空元组
name 子进程的名称
Process类的方法介绍
start() 启动进程,并调用该子进程中的p.run()
run() 进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
terminate() 强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。
is_alive() 如果子进程仍然运行,返回True
join([timeout]) 主线程等待子进程终止(强调:是主线程处于等的状态,而子进程是处于运行的状态)。timeout是可选的超时时间,
需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
Process类的属性介绍 描述
daemon 默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
name 进程的名称
pid 进程的pid
ppid 父进程的ip

5.multiprocessing模块的使用

开启进程的两种方式

第一种,创建子进程,最简单的方法就是用一个目标函数实例化一个Process对象,并调用start()方法让它开始工作。

#示例1
import multiprocessing
import time

def worker(name):
print("%s is working,id:%d" % (self.name, self.pid))
time.sleep(2)
print("%s is work ending,id:%d" % (self.name, self.pid))

if __name__ == '__main__':
    jobs = []
    p1 = multiprocessing.Process(target=worker, args= ("xiaoming",))
    p2 = multiprocessing.Process(target=worker, args= ("dong",))
    p1.start()
    p2.start()
    print('主进程')
    

第二种方法,我们可以通过Process派生出一个定制子类。

mport multiprocessing
import time

class MyProcess(multiprocessing.Process):
    def __init__(se
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值