Python并行编程(十二):进程同步

dukuan 2018-10-18 原文

Python并行编程(十二):进程同步

1、基本概念

      多个进程可以协同工作来完成一项任务,通常需要共享数据。所以在多进程之间保持数据的一致性就很重要,需要共享数据协同的进程必须以适当的策略来读写数据。同步原语和线程的库类似。

      – Lock:一个Lock对象有两个方法acquire和release来控制共享数据的读写权限。

      – Event:一个进程发事件的信号,另一个进程等待事件的信号。Event对象有两个方法set和clear来管理自己内部的变量。

      – Condition:此对象用来同步部分工作流程,在并行的进程中,有两个基本的方法,wait()用来等待进程,notify_all用来通知所有等待此条件的进程。

      – Semaphore:用来共享资源,比如:支持固定数据的共享连接。

      – RLock:递归锁对象,其用途和方法同Threading模块一样。

      – Barrier:将程序分成几个阶段,适用于有些进程必须在某些特性进程之后执行,处于Barrier之后的代码不能同处于Barrier之前的代码并行。

2、测试用例

      使用barrier函数来同步两个进程

import multiprocessing
from multiprocessing import Barrier, Lock, Process
from time import time
from datetime import datetime

def test_with_barrier(synchronizer, serializer):
    name = multiprocessing.current_process().name
    synchronizer.wait()
    now = time()
    with serializer:
        print("process %s ----> %s" %(name, datetime.fromtimestamp(now)))

def test_without_barrier():
    name = multiprocessing.current_process().name
    now = time()
    print("process %s ----> %s" %(name, datetime.fromtimestamp(now)))

if __name__ == "__main__":
    # create a barrier and lock. 
    synchronizer = Barrier(2)
    serializer = Lock()
    # create four processes
    Process(name='p1 - test_with_barrier', target=test_with_barrier, args=(synchronizer, serializer)).start()
    Process(name='p2 - test_with_barrier', target=test_with_barrier, args=(synchronizer, serializer)).start()
    Process(name='p3 - test_without_barrier', target=test_without_barrier).start()
    Process(name='p4 - test_without_barrier', target=test_without_barrier).start()

      运行结果如下:

      

      test_with_barrier函数调用了barrier的wait()方法,当两个进程都调用wait()方法时,他们会一起继续执行。

3、进程之间管理状态

      Python的多进程模块提供了在所有的用户间管理共享信息的管理者(Manager),一个管理者对象控制着持有Python对象的服务进程,并允许其他进程操作共享对象。

      管理者特性:

      – 它控制着管理共享对象的服务进程

      – 它确保当某一进程修改了共享对象之后,所有的进程拿到的共享对象都得到了更新。

      代码示例:

import multiprocessing

def worker(dictionary, key, item):
    dictionary[key] = item
    print("key = %d value = %d" %(key, item))

if __name__ == "__main__":
    mgr = multiprocessing.Manager()
    dictionary = mgr.dict()
    jobs = [multiprocessing.Process(target=worker, args=(dictionary, i, i*2)) for i in range(10)]
    for j in jobs:
        j.start()
    for j in jobs:
        j.join()
    print("Results:",dictionary)

      运行结果:

      

      上述代码创建了一个管理者字典dictionary,在n个job之间共享,每个job都会更新字典的某一个index,所有的job完成之后,最后打印该字典,所有数据均存在。

      

 

发表于 2018-10-18 15:33 杜先生的博客 阅读() 评论() 编辑 收藏

 

版权声明:本文为dukuan原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/dukuan/p/9810812.html

Python并行编程(十二):进程同步的更多相关文章

  1. 老男孩python学习之作业一购物小程序

    想学编程由来已久 始终没有个结果,痛心不已 如今再次捡起来,望不负期望,不负岁月 …… […]...

  2. 翻译:《实用的Python编程》InstructorNotes

    实用的 Python 编程——讲师说明 作者:戴维·比兹利(David Beazley) 概述 对于如何使用我 […]...

  3. Python – Asyncio模块实现的生产消费者模型

    【原创】转载请注明作者Johnthegreat和本文链接 在设计模式中,生产消费者模型占有非常重要的地位,这个 […]...

  4. 哪些 Python 库让你相见恨晚?【转】

    原文链接:https://www.zhihu.com/question/24590883/answer/924 […]...

  5. python open 函数的读写追加

         ...

  6. python读写xml文件

    1.python创建xml使用xml.etree.ElementTree来操作xml创建节点:root = ET.Element('root', attribute), 其中, attribute是属性字...

  7. Python Django 学习 (二) 【Django 模型】

    注: 由于自己排版确实很难看,本文开始使用markdown编辑,希望有所改善 官方定义 A model is […]...

  8. python 匹配网页标签

    python 匹配网页标签 在爬虫的时候需要匹配某一类型的标签,如果网页不是很复杂的话,可以使用下面的方法 i […]...

随机推荐

  1. 阿里云-https免费证书申请与配置 Apache服务器安装SSL证书

    所需材料:        1、域名1个。        2、虚服务器1台。        3、ssl证书1个。 […]...

  2. 如何建立有效的客户关系管理系统

    客户关系管理系统可以有效地把各个渠道传来的客户信息集中在一个数据库里。在公司各个部门之间共享这同一个客户资料数 […]...

  3. 自动化构建工具—gulp的简单配置

    把之前用到的gulp总结整理下,有时候说不出来的,就写出来吧,做个笔记,以后也可以慢慢补充 cnpm i &# […]...

  4. vue面试题

    本文以前端面试官的角度出发,对 Vue 框架中一些重要的特性、框架的原理以问题的形式进行整理汇总,意在帮助作者 […]...

  5. Axure基础操作

    一  简介 Axure RP就是一个快速原型(Rapid Prototyping)设计工具。 快速原型(快速模 […]...

  6. mysql优化 | 存储引擎,建表,索引,sql的优化建议

    个人对于选择存储引擎,建表,建索引,sql优化的一些建议,希望可以给读者提供一些建议 推荐访问我的个人网站,排 […]...

  7. 一阶RC低通滤波器详解(仿真+matlab+C语言实现)

    文章目录 1 预备知识 2 simulink 仿真 3 simulink 运行结果 4 matlab实现 5 […]...

  8. 正则表达式编写工具

    https://regexr.com/...

展开目录

目录导航