一、multipricessing模块的介绍

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

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

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

二、Process模块的介绍

基本格式:

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() #(通知操作系统)开启此进程

通过类的方式调用:

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() #开启进行

参数介绍:

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

方法介绍:

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

属性介绍:

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

p.name 进程名

p.pid 进程的pid

三、守护进程

主进程创建守护进程

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

  其二:守护进程内无法再开启子进程,否则抛出异常: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模块支持两种形式:队列和管道,这两种方式都是使用消息传递的

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()) #拿数据

python并发编程中的多进程(代码实现)的更多相关文章

  1. Python并发编程系列之多进程(multiprocessing)

    1 引言 本篇博文主要对Python中并发编程中的多进程相关内容展开详细介绍,Python进程主要在multiprocessing模块中,本博文以multiprocessing种Process类为中心 ...

  2. Python并发编程一(多进程)

    1.背景知识(进程.多道技术) 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一 ...

  3. python 并发编程 多线程与多进程的区别

    1.开进程的开销远大于开线程 2 同一进程内的线程共享该进程的数据,进程之间地址空间是隔离的 1 开进程的开销远大于开线程 from multiprocessing import Process de ...

  4. Python并发编程之深入理解yield from语法(八)

    大家好,并发编程 进入第八篇. 直到上一篇,我们终于迎来了Python并发编程中,最高级.最重要.当然也是最难的知识点--协程. 当你看到这一篇的时候,请确保你对生成器的知识,有一定的了解.当然不了解 ...

  5. Python并发编程系列之多线程

    1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...

  6. python 并发编程 多线程 目录

    线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...

  7. Python并发编程__多进程

    Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...

  8. python并发编程&多进程(二)

    前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...

  9. python并发编程&多进程(一)

    本篇理论居多,实际操作见:  python并发编程&多进程(二) 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行) ...

随机推荐

  1. [design pattern](3) Dectorator

    前言 很久没有写关于设计模式的博客了,实在是没有太多的精力去写.但个人觉得设计模式在我们的日常开发中还是挺重要的,它提高了软件的可维护性.因此还是有必要坚持学习设计模式,写博客主要是为了加深我对设计模 ...

  2. 关于TCP/IP,必须知道的十个知识点(转)

    三次握手四次挥手可参考:http三次握手,四次挥手 本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一.TCP/IP模型 TCP/IP协议模型(T ...

  3. oracle调整链接数

    50用户以下:8GB 混用,oracle 占据1GB~3GB内存,open_cursors:300,processes:10050-100用户:16GB 混用,oracle 占据3~4GB内存,ope ...

  4. 配置kubernetes.client的参数遇到的坑

    配置kubernetes.client遇到的一些坑: 一,job-name不能重名,如果job-name已经有了,再创建job,则会发生冲突cliflict 这样将会报以下错误:Reason : Co ...

  5. vue 自己写的一个日历

    样式: //quanbu全部代码 <template> <div class="priceListContent clearfix"> <!-- 顶部 ...

  6. eclipse有时候导入了包,但是还是有红线,找不到

    clean一下工程,选择project->clean->clean project selected blow并且选择build only the selected project

  7. mysql 5.5 安装教程

    (转自:https://www.cnblogs.com/solargen/p/6835399.html) 1. 官网下载mysql5.5 下载地址: http://dev.mysql.com/down ...

  8. Flink整体执行流程

    以Flink源码中自带的WordCount为例,执行的入口从用户程序的execute()函数入手,execute()的源码如下: public JobExecutionResult execute(S ...

  9. SSTap | ProxyCap

    SSTap  SSTap 全称 SOCKSTap, 是一款利用虚拟网卡技术在网络层实现的代理工具.SSTap 能在网络层拦截所有连接并转发给 HTTP, SOCKS4/5, SHADOWSOCKS(R ...

  10. jmeter函数介绍(1)

    1._Random() 随机数 The minimum value allowed for a range of values:输入一个最小值: The maximum value allowed f ...