前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python并发编程之多进程(实现)

python并发编程之多进程(实现)

作者头像
人生不如戏
发布2018-04-12 11:37:54
1.1K0
发布2018-04-12 11:37:54
举报
文章被收录于专栏:抠抠空间

一、multipricessing模块的介绍

     python中的多线程无法利用多核优势,如果想要充分的使用多核CPU资源,在python中大部分情况下需要用多线程,python提供了multiprocessing模块

     multiprocessing模块用来开启子进程,并在子进程中执行我们的任务(比如函数),该模块与多线程模块threading类的编程接口类似。

  multiprocessing模块的功能众多:支持子进程、通信和共享数据,执行不同形式的同步,提供了Process类,Queue类,Pipe类,Lock类等组件

二、Process模块的介绍

基本格式:

代码语言:javascript
复制
1 from multiprocessing import Process         #导入模块
2 
3 def func(x):                                #定义一个函数(等待开一个新线程执行的函数)
4     print(x)
5 
6 if __name__ == '__main__':                  #windows下一定要加上这句话才能运行
7     p = Process(target=func,args=('传参',)) #实例化一个进程,将函数名作为参数传递,将需要传给函数的参数(元组形式)传递
8     p.start()                               #(通知操作系统)开启此进程

通过类的方式调用:

代码语言:javascript
复制
from multiprocessing import Process     #调用模块

class MyProcess(Process):               #定义一个类,必须要继承Process类
    def __init__(self,name):            #如果需要参数,一定要有init方法
        super().__init__()              #如果有init方法,一定要调用父类的init方法
        self.name = name

    def run(self):                      #一定要实现一个run方法来重写父类的run
        print('子进程%s已开启'%self.name)

if __name__ == '__main__':
    p = MyProcess('aaa')                #实例化一个自定义类的对象
    p.start()                           #开启进行

参数介绍:

代码语言:javascript
复制
target表示调用对象,既子进程要执行的任务
args表示调用对象的位置参数元组,如:args=(1,)或者args=(1,2)
kwargs表示调用对象的字典,如:kwargs={'name':'fuyong'}

方法介绍:

代码语言:javascript
复制
p.start()    启动进程,并且调用该子进程的run()方法
p.run()      进程启动时运行的方法,正式它去调用target指定的函数,我们自定义类的话一定要实现该方法
P.terminate()强制终止程序p,不会进行任何清理操作,如果p创建了子进程,那么该子进程就成了‘僵尸进程
             使用此方法时要特别小心,如果p还保留了一个锁,那么锁也不会被释放,进而导致了死锁
p.is_alive() 判断p是否还在运行,在运行返回True
p.join()     如果加上此方法,那么主线程将等着此线程运行完毕之后才会运行

属性介绍:

代码语言:javascript
复制
p.daemon 默认值为False,如果设置为True,则代表后台运行的守护进程,当p的父进程终止时,p也会随之终止

p.name 进程名

p.pid 进程的pid

三、守护进程

代码语言:javascript
复制
主进程创建守护进程

  其一:守护进程会在主进程代码执行结束后就终止

  其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children

注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即终止



设置守护进程的方法:

p.daemon = True
p.daemon 默认值为False,如果设置为True,则代表后台运行的守护进程,当p的父进程终止时,p也会随之终止

四、进程同步(锁)

进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,

而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理

加锁方式:

1、导入Lock类

2、实例化一个锁   lock = Lock()

3、将lock作为参数传给子进程函数

4、函数在需要枷锁的代码前加上lock.acquire()方法,在需要释放锁的地方加上lock.release()方法

五、队列

   进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的

代码语言:javascript
复制
from multiprocessing import Queue

q = Queue(3)  #限制最多放3个  如果超过3个则会堵塞,需要等待拿出去1个之后才能继续放

q.put(1)      #放数据(可以放任何数据类型)
q.put(2)      #放数据(可以放任何数据类型)
q.put(3)      #放数据(可以放任何数据类型)

print(q.get()) #拿数据
print(q.get()) #拿数据
print(q.get()) #拿数据
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-02-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、multipricessing模块的介绍
  • 二、Process模块的介绍
    • 基本格式:
      • 通过类的方式调用:
        • 参数介绍:
          • 方法介绍:
            • 属性介绍:
            • 三、守护进程
            • 四、进程同步(锁)
            • 五、队列
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档