python并发编程中的多进程(代码实现)
一、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并发编程中的多进程(代码实现)的更多相关文章
- Python并发编程系列之多进程(multiprocessing)
1 引言 本篇博文主要对Python中并发编程中的多进程相关内容展开详细介绍,Python进程主要在multiprocessing模块中,本博文以multiprocessing种Process类为中心 ...
- Python并发编程一(多进程)
1.背景知识(进程.多道技术) 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一 ...
- python 并发编程 多线程与多进程的区别
1.开进程的开销远大于开线程 2 同一进程内的线程共享该进程的数据,进程之间地址空间是隔离的 1 开进程的开销远大于开线程 from multiprocessing import Process de ...
- Python并发编程之深入理解yield from语法(八)
大家好,并发编程 进入第八篇. 直到上一篇,我们终于迎来了Python并发编程中,最高级.最重要.当然也是最难的知识点--协程. 当你看到这一篇的时候,请确保你对生成器的知识,有一定的了解.当然不了解 ...
- Python并发编程系列之多线程
1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...
- python 并发编程 多线程 目录
线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...
- Python并发编程__多进程
Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...
- python并发编程&多进程(二)
前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...
- python并发编程&多进程(一)
本篇理论居多,实际操作见: python并发编程&多进程(二) 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行) ...
随机推荐
- [design pattern](3) Dectorator
前言 很久没有写关于设计模式的博客了,实在是没有太多的精力去写.但个人觉得设计模式在我们的日常开发中还是挺重要的,它提高了软件的可维护性.因此还是有必要坚持学习设计模式,写博客主要是为了加深我对设计模 ...
- 关于TCP/IP,必须知道的十个知识点(转)
三次握手四次挥手可参考:http三次握手,四次挥手 本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. 一.TCP/IP模型 TCP/IP协议模型(T ...
- oracle调整链接数
50用户以下:8GB 混用,oracle 占据1GB~3GB内存,open_cursors:300,processes:10050-100用户:16GB 混用,oracle 占据3~4GB内存,ope ...
- 配置kubernetes.client的参数遇到的坑
配置kubernetes.client遇到的一些坑: 一,job-name不能重名,如果job-name已经有了,再创建job,则会发生冲突cliflict 这样将会报以下错误:Reason : Co ...
- vue 自己写的一个日历
样式: //quanbu全部代码 <template> <div class="priceListContent clearfix"> <!-- 顶部 ...
- eclipse有时候导入了包,但是还是有红线,找不到
clean一下工程,选择project->clean->clean project selected blow并且选择build only the selected project
- mysql 5.5 安装教程
(转自:https://www.cnblogs.com/solargen/p/6835399.html) 1. 官网下载mysql5.5 下载地址: http://dev.mysql.com/down ...
- Flink整体执行流程
以Flink源码中自带的WordCount为例,执行的入口从用户程序的execute()函数入手,execute()的源码如下: public JobExecutionResult execute(S ...
- SSTap | ProxyCap
SSTap SSTap 全称 SOCKSTap, 是一款利用虚拟网卡技术在网络层实现的代理工具.SSTap 能在网络层拦截所有连接并转发给 HTTP, SOCKS4/5, SHADOWSOCKS(R ...
- jmeter函数介绍(1)
1._Random() 随机数 The minimum value allowed for a range of values:输入一个最小值: The maximum value allowed f ...