简介

可以先看看并发Concurrent与并行Parallel的区别

在谈并行前,头脑中总会浮出多线程、多进程、线程/进程同步、线程/进程通信等词语。

那为什么需要同步、通信,它们之间的作用是怎样的呢?

通信,稍微好理解,就是多线程/进程之间相互通话,比如我打电话呼叫你,我说什么,你答什么,或者我说,你只听。它着重于数据的传递

同步,其实是相对于共享内存而言,比如,我们在同一时刻同一个地方修改了共享对象的数据,这样就会导致数据的篡改,得不到理想中的结果,这时就需要同步。它的基础是基于共享同一个对象而言。

现在软件世界中,存在着很多模式和框架,比如设计模式,MVC框架,那么并行编程是否也存在某些模式呢?

常用的四种并行模式

  1. 共享内存模式(The shared memory model)
  2. 多线程模式(The multithread model)
  3. 分布式内存/消息传递模式(The distributed memory/message passing model)
  4. 数据并行模式(The data parallel model)

现在我们再来看看线程/进程同步,它们是不是基于共享内存模式;线程/进程通信对应着消息传递模式。

说明一点:数据并行,是将数据分割成多组相互独立的数据处理。

设计并发程序的四个阶段(PCAM设计方法学):

  1. 划分(Partitioning):分解成小的任务,开拓并发性
  2. 通讯(Communication):确定诸任务间的数据交换,监测划分的合理性;
  3. 组合(Agglomeration):依据任务的局部性,组合成更大的任务;
  4. 映射(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》

2、并行算法的一般设计过程

Python并行(parallel)之谈的更多相关文章

  1. Python 并行分布式框架 Celery

    Celery 简介 除了redis,还可以使用另外一个神器---Celery.Celery是一个异步任务的调度工具. Celery 是 Distributed Task Queue,分布式任务队列,分 ...

  2. python进阶_浅谈面向对象进阶

    python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass  class F ...

  3. Python测试开发-浅谈如何自动化生成测试脚本

    Python测试开发-浅谈如何自动化生成测试脚本 原创: fin  测试开发社区  前天 阅读文本大概需要 6.66 分钟. 一 .接口列表展示,并选择 在右边,点击选择要关联的接口,区分是否要登录, ...

  4. 【转】Python 并行分布式框架 Celery

    原文链接:https://blog.csdn.net/freeking101/article/details/74707619 Celery 官网:http://www.celeryproject.o ...

  5. Python并行编程的几个要点

    一.基于线程的并行编程 如何使用Python的线程模块 如何定义一个线程 如何探测一个线程 如何在一个子类中使用线程 Lock和RLock实现线程同步 信号实现线程同步 条件(condition)实现 ...

  6. Python并行编程(一):基本概念

    1.线程和进程 进程是应用程序的一个执行实例,比如,在桌面上双击浏览器将会运行一个浏览器.线程是一个控制流程,可以在进程内与其他活跃的线程同时执行.控制流程指的是顺序执行一些机器指令.进程可以包含多个 ...

  7. Python并行实例

    任务 def single(): # 单进程单线程实现 s = 0 for i in range(1, N): s += math.sqrt(i) return s 结论 Python多线程无法利用多 ...

  8. C#并行Parallel编程模型实战技巧手册

    一.课程介绍 本次分享课程属于<C#高级编程实战技能开发宝典课程系列>中的一部分,阿笨后续会计划将实际项目中的一些比较实用的关于C#高级编程的技巧分享出来给大家进行学习,不断的收集.整理和 ...

  9. python学习(28) 浅谈可变对象的单例模式设计

    python开发,有时候需要设计单例模式保证操作的唯一性和安全性.理论上python语言底层实现和C/C++不同,python采取的是引用模式,当一个对象是可变对象,对其修改不会更改引用的指向,当一个 ...

随机推荐

  1. java多线程-----volatile

    谈谈Java中的volatile   内存可见性 留意复合类操作 解决num++操作的原子性问题 禁止指令重排序 总结 内存可见性 volatile是Java提供的一种轻量级的同步机制,在并发编程中, ...

  2. Ubuntu系统下使用Jenkins进行项目的自动构建还是项目回滚方法

    上面虽然实现了项目的自动部署,但是有时部署失败的时候我们需要回滚到指定版本的构建,这样才能更灵活的进行项目的构建部署.我们可以选择“参数化的构建过程”进行传递不同的参数来选择是进行新的构建还是回滚 如 ...

  3. oracle用户名和密码到期后如何处理

    原因:确定是由于Oracle11g中默认在default概要文件中设置了“PASSWORD_LIFE_TIME=180天”所导致. 影响: 1.密码过期后,业务进程连接数据库异常,影响业务使用. 2. ...

  4. stm32 学习参考(转)

    源:stm32 学习参考 单片机裸机下写一个自己的shell调试器     LWIP_STM32_ENC28J60_NETCONN_TCP_SERVICER(5)     LWIP_STM32_ENC ...

  5. C# 获取枚举的描述属性

    在使用枚举类型时,我们需要取名称和值,甚至有时候还需要取枚举类型的描述.通过反射,我们能获取到枚举类型的描述属性. 首先我们需要给枚举类型添加描述属性(属性都没有是不可能取到的),[Descripti ...

  6. bootstrap6 关于bs的使用总结

    在同一行中也可以有多个过了行的 "行", 即列的"总宽度"超宽度12. 即实现堆叠display:block和水平排列float的自动控制, 在div的clas ...

  7. hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解

    题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手 ...

  8. github上不去了

    这几天发现github.com上不去了 可能是由于要杜绝国外的人使用最新的技术??从而屏蔽了吗?

  9. Git教程摘录

    http://download.csdn.net/download/lianghesgdmv/9893973  教程doc下载 备用-- 链接:http://pan.baidu.com/s/1gfu2 ...

  10. 线程面试top50题

    转载:java线程面试题: 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开 ...