Python并行(parallel)之谈
简介
可以先看看并发Concurrent与并行Parallel的区别
在谈并行前,头脑中总会浮出多线程、多进程、线程/进程同步、线程/进程通信等词语。
那为什么需要同步、通信,它们之间的作用是怎样的呢?
通信,稍微好理解,就是多线程/进程之间相互通话,比如我打电话呼叫你,我说什么,你答什么,或者我说,你只听。它着重于数据的传递
同步,其实是相对于共享内存而言,比如,我们在同一时刻同一个地方修改了共享对象的数据,这样就会导致数据的篡改,得不到理想中的结果,这时就需要同步。它的基础是基于共享同一个对象而言。
现在软件世界中,存在着很多模式和框架,比如设计模式,MVC框架,那么并行编程是否也存在某些模式呢?
常用的四种并行模式
- 共享内存模式(The shared memory model)
- 多线程模式(The multithread model)
- 分布式内存/消息传递模式(The distributed memory/message passing model)
- 数据并行模式(The data parallel model)
现在我们再来看看线程/进程同步,它们是不是基于共享内存模式;线程/进程通信对应着消息传递模式。
说明一点:数据并行,是将数据分割成多组相互独立的数据处理。

设计并发程序的四个阶段(PCAM设计方法学):
- 划分(Partitioning):分解成小的任务,开拓并发性
- 通讯(Communication):确定诸任务间的数据交换,监测划分的合理性;
- 组合(Agglomeration):依据任务的局部性,组合成更大的任务;
- 映射(Mapping):将每个任务分配到处理器上,提高算法的性能。
案例演示
该案例,采用Python多进程实现。进程间通信在官网的例子叫做Exchanging objects between processes,进程同步在官网的例子叫做Synchronization between processes 以及 Sharing state between processes。
设计并发程序。
首先,任务分解:1个进程专门存储数据,多个进程取数据并进行计算。
其次,进程通信:采取queue队列供存取进程通信。
最后,组合:多个进程计算后的数据,怎么组合在一起呢?采取多进程的共享内存数据Value,如果是多个进程对共享数据操作,则需进行同步。
import multiprocessing def make_data(queue, num, work_nums):
for i in range(num):
queue.put(i)
for i in range(work_nums):
queue.put(None) def handle_data(queue, share_value, lock):
while True:
data = queue.get()
if data is None:
break
lock.acquire()
share_value.value = share_value.value + data
lock.release() if __name__ == "__main__":
queue = multiprocessing.Queue() # 进程间通信所用
share_value = multiprocessing.Value("i", 0) # 进程间共享所用
lock = multiprocessing.Lock() # 进程间共享内存时,采用锁同步机制
num = 10000 #
work_nums = 5 # work进程个数
sub_process = [] # 处理数据进程集合 master_process = multiprocessing.Process(target=make_data, args=(queue, num, work_nums, )) # 生成数据进程
for i in range(work_nums):
sub_process1 = multiprocessing.Process(target=handle_data, args=(queue, share_value, lock,))
sub_process.append(sub_process1) master_process.start()
for p in sub_process:
p.start() master_process.join()
for p in sub_process:
p.join() # 结果对比
result = 0
for i in range(num):
result = result + i
print("result should be " + str(result))
print("fact is " + str(share_value.value))
输出结果:
result should be 49995000
fact is 49995000
参考:
1、《Python Parallel Programming Cookbook》
Python并行(parallel)之谈的更多相关文章
- Python 并行分布式框架 Celery
Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...
- python进阶_浅谈面向对象进阶
python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class F ...
- Python测试开发-浅谈如何自动化生成测试脚本
Python测试开发-浅谈如何自动化生成测试脚本 原创: fin 测试开发社区 前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...
- 【转】Python 并行分布式框架 Celery
原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.o ...
- Python并行编程的几个要点
一.基于线程的并行编程 如何使用Python的线程模块 如何定义一个线程 如何探测一个线程 如何在一个子类中使用线程 Lock和RLock实现线程同步 信号实现线程同步 条件(condition)实现 ...
- Python并行编程(一):基本概念
1.线程和进程 进程是应用程序的一个执行实例,比如,在桌面上双击浏览器将会运行一个浏览器.线程是一个控制流程,可以在进程内与其他活跃的线程同时执行.控制流程指的是顺序执行一些机器指令.进程可以包含多个 ...
- Python并行实例
任务 def single(): # 单进程单线程实现 s = 0 for i in range(1, N): s += math.sqrt(i) return s 结论 Python多线程无法利用多 ...
- C#并行Parallel编程模型实战技巧手册
一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...
- python学习(28) 浅谈可变对象的单例模式设计
python开发,有时候需要设计单例模式保证操作的唯一性和安全性.理论上python语言底层实现和C/C++不同,python采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...
随机推荐
- 我用了7年时间成长为阿里Java架构师,你呢?(附学习路线图)
前言:我用了七年的时间,一步一步走到了现在,中途也有了解过其他的技术,也想过要转其他的语言,但是最后还是坚持下来走Java这条路,希望我的经历可以帮助到后来的人,要是觉得对你有帮助的话,可以点赞关 ...
- ELK学习笔记之Logstash详解
0x00 Logstash概述 官方介绍:Logstash is an open source data collection engine with real-time pipelining cap ...
- Antlr4 入门
一.ANTRL 是什么 ANTLR 是用JAVA写的语言识别工具,它用来声明语言的语法,简称为“元语言”(meta-language). ANTLR 语法识别一般分为二个阶段: 1.词法分析阶段 (l ...
- 20145302张薇 《网络对抗技术》 web基础
20145302张薇 <网络对抗> web基础 实验问题回答 1.什么是表单 表单在网页中主要负责数据采集功能:一般网页上需要用户输入.选择的地方都会用到表单 表单标签:即,用于确定表单所 ...
- 从bios启动说起
如果从bios启动说起的话,BIOS去加载bootloader,bootloader去加载操作系统,那么bootloader是怎么找到操作系统的呢?经过一些流程后,它会去找grub:然后通过grub提 ...
- P3066 [USACO12DEC]逃跑的BarnRunning Away From
目录 题目 思路 错误&&注意 代码 题目 luoguP3066 思路 虽说这个题目有多种做法,但 左偏树算法: 我们发现这个合并的时候并不好合并,因为存的值不是固定的 那我们是不是可 ...
- UVa 10766 Organising the Organisation(矩阵树定理)
https://vjudge.net/problem/UVA-10766 题意: 给出n, m, k.表示n个点,其中m条边不能直接连通,求生成树个数. 思路: 这也算个裸题,把可以连接的边连接起来, ...
- STL_算法_02_排序算法
◆ 常用的排序算法: 1.1.合并(容器A(全部/部分)&容器B(全部/部分)==>容器C(全部/部分),容器C中元素已经排好顺序),返回的值==>iteratorOutBegin ...
- 【转】float类型在内存中的表示
http://www.cnblogs.com/onedime/archive/2012/11/19/2778130.html http://blog.csdn.net/adream307/articl ...
- 探秘AOP实现原理
可以这么说,AOP是基于动态代理实现的. 那么,这个过程是怎样的? 首先,我们有这样的一个Service类,它是被作为切面的一个类: public class Service implements U ...