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采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...
随机推荐
- Linux基础命令---显示文本grep
grep 按照指定的模式,在文件中搜索匹配的行,将结果显示在标准输出.另外还有两个指令egrep相当于grep –E,fgrep相当于grep -F.如果没有给出文件名,那么从标准输入读取. 此命令的 ...
- 检测u盘是否挂载上方法
打开内核log:echo "8" > /proc/sys/kernel/printk 关闭内核log:echo "1" > /proc/sys/ke ...
- Python Web学习笔记之IGMP和ICMP的差别
理论技术:TCP/IP协议族(四)ICMP和IGMP协议! 应该先说IP协议的,后来考虑到层次性,还是先把支撑协议介绍完在细说IP!因为IP是我的最爱也是我的痛!呵呵! 一.ICMP协议 为什么要使用 ...
- 修改Nginx配置文件来隐藏index.php
找到你要修改的域名对应nginx配置文件(vhost下),添加如下代码 location / { if (!-e $request_filename) { rewrite ^(.*)$ /index. ...
- mysql与oracle常用函数及数据类型对比00持续补充
最近在转一个原来使用oracle,改为mysql的系统,有些常用的oracle函数的mysql实现顺便整理了下,主要是系统中涉及到的(其实原来是专门整理过一个详细doc的,只是每次找word麻烦). ...
- 08: CORS实现跨域请求
目录: 1.1 cors跨域请求介绍 1.2 使用tornado实现 复杂请求 1.3 Django中使用django-cors-headers解决跨域问题 1.1 cors跨域请求介绍返回顶部 1. ...
- C++ 一串数字三位一节,用逗号隔开表示
#include <iostream> #include <string> #include <sstream> using namespace std; stri ...
- hdu6446 网络赛 Tree and Permutation(树形dp求任意两点距离之和)题解
题意:有一棵n个点的树,点之间用无向边相连.现把这棵树对应一个序列,这个序列任意两点的距离为这两点在树上的距离,显然,这样的序列有n!个,加入这是第i个序列,那么这个序列所提供的贡献值为:第一个点到其 ...
- 【分布式计算】30分钟概览Spark分布式计算引擎
本文主要帮助初学者快速了解Spark,不会面面俱到,但核心一定点到. Spark是继Hadoop之后的下一代分布式内存计算引擎,于2009年诞生于加州大学伯克利分校AMPLab实验室,现在主要由Dat ...
- java中new一个对象和对象=null有什么区别
原创:转载请注明出处 今天在写代码时,遇到一个问题,特此进行记录. for (ProfileDto profileDto : profile) { // Profile resP ...