2013-09-13 13:48 11613人阅读 评论(2) 收藏 举报
 分类:
Python(38) 

同步的方法基本与多线程相同。

1) Lock

当多个进程需要访问共享资源的时候,Lock可以用来避免访问的冲突。

  1. import multiprocessing
  2. import sys
  3. def worker_with(lock, f):
  4. with lock:
  5. fs = open(f,"a+")
  6. fs.write('Lock acquired via with\n')
  7. fs.close()
  8. def worker_no_with(lock, f):
  9. lock.acquire()
  10. try:
  11. fs = open(f,"a+")
  12. fs.write('Lock acquired directly\n')
  13. fs.close()
  14. finally:
  15. lock.release()
  16. if __name__ == "__main__":
  17. f = "file.txt"
  18. lock = multiprocessing.Lock()
  19. w = multiprocessing.Process(target=worker_with, args=(lock, f))
  20. nw = multiprocessing.Process(target=worker_no_with, args=(lock, f))
  21. w.start()
  22. nw.start()
  23. w.join()
  24. nw.join()
 
在上面的例子中,如果两个进程没有使用lock来同步,则他们对同一个文件的写操作可能会出现混乱。

2)Semaphore

Semaphore用来控制对共享资源的访问数量,例如池的最大连接数。

  1. import multiprocessing
  2. import time
  3. def worker(s,i):
  4. s.acquire()
  5. print(multiprocessing.current_process().name + " acquire")
  6. time.sleep(i)
  7. print(multiprocessing.current_process().name + " release")
  8. s.release()
  9. if __name__ == "__main__":
  10. s = multiprocessing.Semaphore(2)
  11. for i in range(5):
  12. p = multiprocessing.Process(target=worker, args=(s,i*2))
  13. p.start()

上面的实例中使用semaphore限制了最多有2个进程同时执行。

3)Event

Event用来实现进程间同步通信。

  1. import multiprocessing
  2. import time
  3. def wait_for_event(e):
  4. """Wait for the event to be set before doing anything"""
  5. print ('wait_for_event: starting')
  6. e.wait()
  7. print ('wait_for_event: e.is_set()->' + str(e.is_set()))
  8. def wait_for_event_timeout(e, t):
  9. """Wait t seconds and then timeout"""
  10. print ('wait_for_event_timeout: starting')
  11. e.wait(t)
  12. print ('wait_for_event_timeout: e.is_set()->' + str(e.is_set()))
  13. if __name__ == '__main__':
  14. e = multiprocessing.Event()
  15. w1 = multiprocessing.Process(name='block',
  16. target=wait_for_event,
  17. args=(e,))
  18. w1.start()
  19. w2 = multiprocessing.Process(name='non-block',
  20. target=wait_for_event_timeout,
  21. args=(e, 2))
  22. w2.start()
  23. time.sleep(3)
  24. e.set()
  25. print ('main: event is set')

#the output is:
#wait_for_event_timeout: starting
#wait_for_event: starting
#wait_for_event_timeout: e.is_set()->False
#main: event is set
#wait_for_event: e.is_set()->True

 
 

【python】多进程锁multiprocess.Lock的更多相关文章

  1. 多进程操作-进程锁multiprocess.Lock的使用

    多进程操作-进程锁multiprocess.Lock的使用 ​ 通过之前的Process模块的学习,我们实现了并发编程,虽然更加充分地利用了IO资源,但是也有缺陷:当多个进程共用一份数据资源的时候,就 ...

  2. python 多进程锁Lock和共享内存

    多进程锁 lock = multiprocessing.Lock() 创建一个锁 lock.acquire() 获取锁 lock.release() 释放锁 with lock: 自动获取.释放锁 类 ...

  3. 进程同步(multiprocess.Lock、multiprocess.Semaphore、multiprocess.Event) day38

    进程同步(multiprocess.Lock.multiprocess.Semaphore.multiprocess.Event) 锁 —— multiprocess.Lock 通过刚刚的学习,我们千 ...

  4. 铁乐学python_Day39_多进程和multiprocess模块2

    铁乐学python_Day39_多进程和multiprocess模块2 锁 -- multiprocess.Lock (进程同步) 之前我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发 ...

  5. Python多进程编程-进程间协作(Queue、Lock、Semaphore、Event、Pipe)

    进程与进程之间是相互独立的,互不干扰.如果多进程之间需要对同一资源操作,就需要进程间共享变量,上一篇文章介绍了进程间共享数据的三大类Value.Array.Manager,这三种类的主要区别在于管理的 ...

  6. Python 之并发编程之进程中(守护进程(daemon)、锁(Lock)、Semaphore(信号量))

    五:守护进程 正常情况下,主进程默认等待子进程调用结束之后再结束守护进程在主进程所有代码执行完毕之后,自动终止kill -9 进程号 杀死进程.守护进程的语法:进程对象.daemon = True设置 ...

  7. python多进程与多线程编程

    进程(process)和线程(thread)是非常抽象的概念.多线程与多进程编程对于代码的并发执行,提升代码运行效率和缩短运行时间至关重要.下面介绍一下python的multiprocess和thre ...

  8. Python多进程与多线程编程及GIL详解

    介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...

  9. python 多进程开发与多线程开发

    转自: http://tchuairen.blog.51cto.com/3848118/1720965 博文作者参考的博文:  博文1  博文2 我们先来了解什么是进程? 程序并不能单独运行,只有将程 ...

随机推荐

  1. HighChart报表之饼图

    个人认为HighChart做报表还是很不错的,从报表的样式还是性能都是很不错的选择. 1.新建一个html页面,命名为:ReportTest.html <script type="te ...

  2. Spark源码学习1.3——TaskSetManager.scala

    TaskSetManager.scala TaskSet是指一系列被提交的task,一般是代表特定的stage中丢失的partition.TaskSetManager通过一个TaskScheduler ...

  3. list排序

    今天要对List排序,上网查了很多方法都感觉比较麻烦,现在终于找到了两种比较简便的方式,在此写出来,防止忘记!同时供大家参考! using System; using System.Collectio ...

  4. iOS8后core location框架启动定位服务的步骤

    1.在使用CoreLocation前需要调用如下函数[iOS 8专用]: iOS 8对定位进行了一些修改,其中包括定位授权的方法,CLLocationManager增加了下面的两个方法: (1)始终允 ...

  5. win系统登录密码重置

    [1]制作PE启动盘,参考 http://jingyan.baidu.com/article/72ee561aadfb1fe16138dfab.html [2]拿PE启动盘启动电脑,重置密码,参考 h ...

  6. MySQL中的information_schema数据库详解

    information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式.什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等.有些时候用于表述该信 ...

  7. 【Python】实现简单循环

    # -*- coding:utf-8 -*- #猜数字游戏 lucky_num = 6 count = 0 while count < 3: input_num = int(raw_input( ...

  8. 使用注解配置Spring框架自动代理通知

    话不多说上代码 项目架构图及Lib包如下: 第二步创建业务类接口 package cn.happy.day01.entity; /** * 1.业务接口 * @author Happy * */ pu ...

  9. PHP基于websocket实时通信的实现—GoEasy

    PHP websocket实时消息推送 在这里我记录一下之前如何实现服务器端与客户端实时通信: 实现步骤如下: 1.        获取GoEasy appkey. 在goeasy官网上注册一个账号, ...

  10. [转]OOAD基本概念

    转载地址:http://www.cnblogs.com/zfc2201/archive/2012/12/09/2810532.html 尊重原作者,转载请注明 学习目标: 1.理解与掌握面向对象的概念 ...