Python3 多进程编程 - 学习笔记
Python3 多进程编程(Multiprocess programming)
为什么使用多进程
python中的多线程其实并不是真正的多线程,不能充分地使用多核CPU的资源,此时需要使用需要使用多进程解决问题。
具体用法
Python中的多进程是通过multiprocessing模块来实现的,和多线程的threading.Thread类似,利用multiprocessing.Process来创建一个进程对象。进程对象的方法和线程对象的方法类似,也有start(), join()等。
直接启用
代码实例
import multiprocessing
from time import sleep def clock(interval):
i = 0
while i<5:
i += 1
print(f"Run >>> {i}")
sleep(interval)
print("Ending!") if __name__ == '__main__':
p = multiprocessing.Process(target = clock, args = (1,))
p.start()
p.join()运行结果
Run >>> 1
Run >>> 2
Run >>> 3
Run >>> 4
Run >>> 5
Ending!
继承自
multiprocessing.Process调用与多线程使用方法类似
- 直接继承Process
- 重写run函数
- 类实例可以直接运行
代码实例
import multiprocessing
from time import sleep class ClockProcess(multiprocessing.Process):
def __init__(self, interval):
super().__init__()
self.interval = interval def run(self):
i = 0
while i<5:
i += 1
print(f"Run >>> {i}")
sleep(self.interval)
print("Ending!") if __name__ == '__main__':
p = ClockProcess(1)
p.start()
p.join()运行结果
Run >>> 1
Run >>> 2
Run >>> 3
Run >>> 4
Run >>> 5
Ending!
守护进程
- 设置该进程为守护进程,即认为此进程不重要,主进程结束后,该进程随即结束。
- 用法
Process.daemon = Ture
未使用守护进程
import multiprocessing
from time import sleep def clock(interval):
i = 0
while i<5:
i += 1
print(f"Run >>> {i}")
sleep(interval)
print("Ending!") def run():
p = multiprocessing.Process(target = clock, args = (1,))
p.start() if __name__ == '__main__':
run()
sleep(2)
print("ENDING!")
运行结果
Run >>> 1
Run >>> 2
ENDING!
Run >>> 3
Run >>> 4
Run >>> 5
Ending!
使用守护进程
import multiprocessing
from time import sleep def clock(interval):
i = 0
while i<5:
i += 1
print(f"Run >>> {i}")
sleep(interval)
print("Ending!") def run():
p = multiprocessing.Process(target = clock, args = (1,))
p.daemon = True
p.start() if __name__ == '__main__':
run()
sleep(2)
print("ENDING!")
运行结果
Run >>> 1
Run >>> 2
ENDING!
Python多线程的通信
进程是系统独立调度核分配系统资源的基本单位,进程之间是相互独立的,进程之间的数据也不能共享,这是多进程在使用中与多线程最明显的区别。
所以要使用多进程来弥补Python中多线程的不足,解决多进程之间的通信时关键。
进程对列Queue
在python多进程中,Queue其实就是进程之间的数据管道,实现进程通信。
生产者消费者问题
仓库(固定大小的中间缓冲区)
生产者
持续生产数据传入仓库
消费者
持续从仓库总提取数据
在实际运行时会产设的问题。生产者的主要作用是生成一定量的数据放到仓库中,然后重复此过程。
与此同时,消费者也在仓库消耗这些数据。该问题的关键就是要保证生产者不会在仓库满时加入数据,消费者也不会在仓库空时消耗数据。
JoinableQueue
JoinableQueue同样通过multiprocessing使用。
JoinableQueue([maxsize]):就是一个Queue对象,但允许项目的使用者通知生成者项目已经被成功处理。
maxsize是队列中允许最大项数,省略则无大小限制。
方法介绍:
JoinableQueue与Queue对象的方法一致,且之外还具有:
JoinableQueue.task_done():使用者使用此方法发出信号,表示q.get()的返回项目已经被处理。如果调用此方法的次数大于从队列中删除项目的数量,将引发ValueError异常。JoinableQueue.join():生产者调用此方法进行阻塞,直到队列中所有的项目均被处理。阻塞将持续到队列中的每个项目均调用JoinableQueue.task_done()方法为止。
Queue实例
使用JoinableQueue实现生产者消费者模型
代码
import multiprocessing
from time import ctime,sleep def consumer(input_q):
print("消费开始:", ctime())
while True:
# 处理项
item = input_q.get()
print ("消费 >>>>>>>>>", item) # 此处替换为有用的工作
input_q.task_done() # 发出信号通知任务完成
sleep(1)
print ("消费结束:", ctime()) ##此句未执行,因为q.join()收集到四个task_done()信号后,主进程启动,未等到print此句完成,程序就结束了 def producer(sequence, output_q):
print ("生产开始:", ctime())
for item in sequence:
output_q.put(item)
print ("生产 >>>>>>>>>", item)
sleep(1)
print ("生产结束:", ctime()) if __name__ == '__main__':
q = multiprocessing.JoinableQueue()
# 运行消费者进程
cons_p = multiprocessing.Process (target = consumer, args = (q,))
cons_p.daemon = True
cons_p.start() # 生产多个项,sequence代表要发送给消费者的项序列
# 在实践中,这可能是生成器的输出或通过一些其他方式生产出来
sequence = [1,2,3,4]
producer(sequence, q)
# 等待所有项被处理
q.join()
运行结果
生产开始: Wed Oct 16 22:06:11 2019
生产 >>>>>>>>> 1
消费开始: Wed Oct 16 22:06:11 2019
消费 >>>>>>>>> 1
生产 >>>>>>>>> 2
消费 >>>>>>>>> 2
生产 >>>>>>>>> 3
消费 >>>>>>>>> 3
生产 >>>>>>>>> 4
消费 >>>>>>>>> 4
生产结束: Wed Oct 16 22:06:15 2019
管道Pipe
待续
Python3 多进程编程 - 学习笔记的更多相关文章
- Python3 多线程编程 - 学习笔记
线程 什么是线程 特点 线程与进程的关系 Python3中的多线程 全局解释器锁(GIL) GIL是啥? GIL对Python程序有啥影响? 改善GIL产生的问题 Python3关于多线程的模块 多线 ...
- python多进程编程学习笔记
摘自[https://www.cnblogs.com/chenhuabin/p/10070996.html] by 奥辰 赞
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- Linux Shell编程学习笔记——目录(附笔记资源下载)
LinuxShell编程学习笔记目录附笔记资源下载 目录(?)[-] 写在前面 第一部分 Shell基础编程 第二部分 Linux Shell高级编程技巧 资源下载 写在前面 最近花了些时间学习She ...
- DirectX 11游戏编程学习笔记之8: 第6章Drawing in Direct3D(在Direct3D中绘制)(习题解答)
本文由哈利_蜘蛛侠原创,转载请注明出处.有问题欢迎联系2024958085@qq.com 注:我给的电子版是700多页,而实体书是800多页,所以我在提到相关概念的时候 ...
- 多线程编程学习笔记——async和await(一)
接上文 多线程编程学习笔记——任务并行库(一) 接上文 多线程编程学习笔记——任务并行库(二) 接上文 多线程编程学习笔记——任务并行库(三) 接上文 多线程编程学习笔记——任务并行库(四) 通过前面 ...
- 多线程编程学习笔记——async和await(二)
接上文 多线程编程学习笔记——async和await(一) 三. 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步 ...
- 多线程编程学习笔记——async和await(三)
接上文 多线程编程学习笔记——async和await(一) 接上文 多线程编程学习笔记——async和await(二) 五. 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多 ...
- 多线程编程学习笔记——使用异步IO(一)
接上文 多线程编程学习笔记——使用并发集合(一) 接上文 多线程编程学习笔记——使用并发集合(二) 接上文 多线程编程学习笔记——使用并发集合(三) 假设以下场景,如果在客户端运行程序,最的事情之一是 ...
随机推荐
- css定位的理解
在CSS中关于定位的内容是:position:relative | absolute | static | fixed ● static 没有特别的设定,遵循基本的定位规定,不能通过z-index进行 ...
- 关于BUG管理工具的操作总结。(禅道)
禅道是第一款国产的优秀开源项目管理软件.先进的管理思想,合理的软件架构,简洁实效的操作,优雅的代码实现,灵活的扩展机制,强大而易用的api 调用机制,多语言支持,多风格支持,搜索功能,统计功能——这一 ...
- SAS市场研究应用介绍:组合/联合分析
SAS市场研究应用介绍:组合/联合分析 一 SAS市场研究模块介绍 市场研究是指研究组织(企业)与客户.公众三者关系的规律的过程,是市场营销领域中的一个重要元素.它把消费者.客户.公众和营销者通过信息 ...
- 利用爬虫爬取指定用户的CSDN博客文章转为md格式,目的是完成博客迁移博文到Hexo等静态博客
文章目录 功能 爬取的方式: 设置生成的md文件命名规则: 设置md文件的头部信息 是否显示csdn中的锚点"文章目录"字样,以及下面具体的锚点 默认false(因为csdn中是集 ...
- sed命令详解 (转载)
sed是stream editor的简称,也就是流编辑器.它一次处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内 ...
- &与&&,|与||的区别
今天在做leetcode的时候,遇到了运算符的不同而导致结果不一致的问题.记录一下提醒自己 中文名称与英文名称 &:按位与(Bitwise and) &&:逻辑与(logica ...
- 3-vim-打开和新建文件-02-删除交换文件
vim的异常处理 如果vim异常退出,在磁盘上可能会保存有交换文件. 若使用vi编辑该文件时看到如下图信息,按下字母d就可以删除交换文件. 注意:输入命令操作的时候关闭输入法.
- Django项目从新建到运行
返回主目录:Django框架 内容目录: 一.安装之前 二.Django安装 三.创建项目 四.配置 一.安装之前 安装django之前你需要注意的几个事项: 1.版本问题 建议使用1.11.11左右 ...
- thinkphp 模块部署
3.2对模块的访问是自动判断的,所以通常情况下无需配置模块列表即可访问,在部署模块的时候,默认情况下都是基于类似于子目录的URL方式来访问模块的,例如: http://serverName/Home/ ...
- Openssl命令的使用
用途: pkcs8格式的私钥转换工具.它处理在PKCS#8格式中的私钥文件.它可以用多样的PKCS#5 (v1.5 and v2.0)和 PKCS#12算法来处理没有解密的PKCS#8 Private ...