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. Xcode清除缓存、清理多余证书

    Xcode清除缓存.清理多余证书 1.删除Xcode中多余的证书provisioning profile 手动删除: Xcode6 provisioning profile path: ~/Libra ...

  2. JS弹窗数据带回

    父窗口代码: function selectCar_Team_Info(){ //var url = "<%=basepath_%>ec/jsp/carLoading/carTe ...

  3. Java和eclipse常用操作

    eclipse: ctrl+F10 显示行号 ctrl+shift+F 自动对齐 ctrl+/ 注释 java: jar包: Manifest-Version - 指定清单文件的版本号 Main-Cl ...

  4. 初学Spring

    Spring是当今最流行的框架,今天开始,dayday同学要正式开始学习Spring了,加油 以下是一个简单的应用Spring框架的java程序 src\dayday\HelloSpring.java ...

  5. sqlserverdriver配置方法 jdbc连接sqlserver

    一.下载驱动程序. 下载地址:http://download.microsoft.com/download/8/B/D/8BDABAE2-B6EA-41D4-B903-7916EF3690EF/sql ...

  6. hdu 2069

    #include "stdio.h" int main(){ int num,i1,i2,i3,i4,i5,n; int n1,n2,n3,n4,n5; while(~scanf( ...

  7. macbook air 128g 磁盘清理

    使用 du 命令发现 ~/Library/Developer/Xcode/DerivedData  占用了大量空间,这些都是xcode对以前建过的project源码文件建立的索引等,如果不需要可以都删 ...

  8. PKU 1003解题

    首先庆祝一下,今天连A了3题.感觉后面这题太简单了.. 由于英文不好 ,找了个翻译: 若将一叠卡片放在一张桌子的边缘,你能放多远?如果你有一张卡片,你最远能达到卡片长度的一半.(我们假定卡片都正放在桌 ...

  9. NSOperation基本概念

    NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程   NSOperation和NSOperationQueue实现多线程的具体步骤 先将 ...

  10. 使用js实现input输入框的增加

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...