python并发编程之多进程(实现)
一、multipricessing模块的介绍
python中的多线程无法利用多核优势,如果想要充分的使用多核CPU资源,在python中大部分情况下需要用多线程,python提供了multiprocessing模块
multiprocessing模块用来开启子进程,并在子进程中执行我们的任务(比如函数),该模块与多线程模块threading类的编程接口类似。
multiprocessing模块的功能众多:支持子进程、通信和共享数据,执行不同形式的同步,提供了Process类,Queue类,Pipe类,Lock类等组件
二、Process模块的介绍
基本格式:
from multiprocessing import Process #导入模块 def func(x): #定义一个函数(等待开一个新线程执行的函数)
print(x) if __name__ == '__main__': #windows下一定要加上这句话才能运行
p = Process(target=func,args=('传参',)) #实例化一个进程,将函数名作为参数传递,将需要传给函数的参数(元组形式)传递
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并发编程__多进程
Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...
- Python进阶(4)_进程与线程 (python并发编程之多进程)
一.python并发编程之多进程 1.1 multiprocessing模块介绍 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大 ...
- python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程
python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...
- python并发编程之多进程(三):共享数据&进程池
一,共享数据 展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合 通过消息队列交换数据.这样极大地减少了对使用锁定和其他同步手段的需求, 还可以扩展 ...
- python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型
一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终 ...
- 28 python 并发编程之多进程
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...
- 二 python并发编程之多进程-重点
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...
- 二 python并发编程之多进程实现
一 multiprocessing模块介绍 二 process类的介绍 三 process类的使用 四 守护进程 五 进程同步(锁) 六 队列 七 管道 八 共享数据 九 信号量 十 事件 十一 进程 ...
- python并发编程之多进程(实践篇)
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程.Python提供了multiproce ...
- 第十篇.2、python并发编程之多进程
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...
随机推荐
- Django模板中的数字自增
Django框架的模板提供了{% for %} 标签来进行循环 例如对集合进行循环是比较简单的 {% for row in v1 %} <div>{{row.name}}</div& ...
- Linux ssh双向免密认证
一.实现原理 使用一种被称为"公私钥"认证的方式来进行ssh登录."公私钥"认证方式简单的解释是: 首先在客户端上创建一对公私钥(公钥文件:~/.ssh/id_ ...
- lambdas了解
Lambdas了解 功能接口的一个极其宝贵的特性是可以使用lambdas实例化它们.以下是一些关于lambdas的例子: 以逗号分隔的输入列表,左边是指定类型的输入,右边是返回的块: ...
- CTF---密码学入门第七题 杯酒人生
杯酒人生分值:10 来源: Veneno 难度:易 参与人数:2633人 Get Flag:790人 答题人数:963人 解题通过率:82% 使用古典密码 一喵星人要想喵星发送一段不知道干什么用的密码 ...
- bzoj 3065: 带插入区间K小值(分块)
Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它 ...
- 51 Nod 1029 大数除法【Java大数乱搞】
1029 大数除法 基准时间限制:4 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 给出2个大整数A,B,计算A / B和A Mod B的结果. Input 第1行:大数A ...
- c++(排序二叉树线索化)
前面我们谈到了排序二叉树,还没有熟悉的同学可以看一下这个,二叉树基本操作.二叉树插入.二叉树删除1.删除2.删除3.但是排序二叉树也不是没有缺点,比如说,如果我们想在排序二叉树中删除一段数据的节点怎么 ...
- 了解 Python 语言中的时间处理
python 语言对于时间的处理继承了 C语言的传统,时间值是以秒为单位的浮点数,记录的是从1970年1月1日零点到现在的秒数,这个秒数可以转换成我们日常可阅读形式的日期和时间:我们下面首先来看一下p ...
- Linux文件链接hard link与symbolic link
Linux中文件链接有两种方式,一种是hard link,又称为硬链接:另一种是symbolic link,又称为符号链接.要区分两者的不同要回顾Linux常用的ext2文件系统.这种文件系统使用in ...
- node学习笔记2 —— npm包管理
全局模式安装包 将包安装为全局可用的可执行命令, 并非可以从任意地方require 将 package.json中bin定义的文件软链到统一的目录下, 该目录可以通过如下方式推算出来: path.re ...