multiprocess模块介绍
multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似。
multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。
Process类介绍
# 语法:Process([group [, target [, name [, args [, kwargs]]]]]) 创建一个子进程对象
注意:1.需要使用关键字来指定参数 2.args指定的target函数的位置参数是一个元组,必须有逗号
参数介绍
target表示调用对象,即子进程要执行的任务
args表示调用对象的位置参数元组,args=(1,2,'egon',)
kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
name为子进程的名称
方法介绍
.start():启动进程,并调用该子进程中的p.run()
p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
p.is_alive():如果p仍然运行,返回True
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间。
属性介绍
p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
p.name:进程的名称
p.pid:进程的pid
p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
注意:在windows中Process()必须放到 # if __name__ == '__mian__':下
于Windows没有fork,多处理模块启动一个新的Python进程并导入调用模块。 <br>如果在导入时调用Process(),那么这将启动无限继承的新进程(或直到机器耗尽资源)。 <br>这是隐藏对Process()内部调用的原,使用if __name__ == “__main __”,这个if语句中的语句将不会在导入时被调用。
僵尸进程、孤儿进程、守护进程
僵尸进程:当子进程执行完毕后,会释放资源,只保留一些状态信息且等待父进程回收,这时进程被称为僵尸进程
孤儿进程:子进程执行过程中父进程由于某种原因(被杀死)无法对子进程回收,此时会将这个进程交由init进程来领养(回收),被领养的进程就被称为孤儿进程
守护进程:父进程结束,守护进程也随之结束
互斥锁(锁)
上一次锁,就需要解锁一次,保障数据不会错乱,串行的去执行
队列
实例化一个队列对象
Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。<br>
参数介绍
maxsize是队列中允许最大项数,省略则无大小限制。 <br>
方法介绍
q.put方法用以插入数据到队列中,put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
2 q.get方法可以从队列读取并且删除一个元素。同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
q.empty():调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目。<br>q.full():调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。
q.full():调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。<br>q.qsize():返回队列中目前项目的正确数量,结果也不可靠,理由同q.empty()和q.full()一样<br>复制代码