Chinaunix首页 | 论坛 | 博客
  • 博客访问: 235713
  • 博文数量: 57
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 557
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-01 18:05
文章分类

全部博文(57)

文章存档

2017年(57)

我的朋友

分类: Python/Ruby

2017-12-11 15:29:56

 Lock组件
当我们用多进程来读写文件的时候,如果一个进程是写文件,一个进程是读文件,如果两个文件同时进行,肯定是不行的,必须是文件写结束以后,才可以进行读操作。或者是多个进程在共享一些资源的时候,同时只能有一个进程进行访问,那就要有一个锁机制进行控制。

需求:
一个进程写入一个文件,一个进程追加文件,一个进程读文件,同时启动起来
我们可以通过进程的join()方法来实现,但是为了学习Lock,用Lock来实现。
先看不加锁程序,在看加锁程序,最后比较两个程序的区别
不加锁:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-12-11 15:15
  5. # @file :4.py


  6. import multiprocessing
  7. import time

  8. def add1(lock, value, number):
  9.         print("start add{0} number = {1}".format(value, number))
  10.         for i in xrange(1, 5):
  11.             number += value
  12.             time.sleep(1)
  13.             print("add{0} number = {1}".format(value, number))

  14. def add3(lock, value, number):
  15.     print("start add{0} number = {1}".format(value, number))
  16.     for i in xrange(1, 5):
  17.         number += value
  18.         time.sleep(1)
  19.         print("add{0} number = {1}".format(value, number))



  20. if __name__ == "__main__":
  21.     lock = multiprocessing.Lock()
  22.     number = 0
  23.     pw = multiprocessing.Process(target=add1, args=(lock, 1, number))
  24.     pa = multiprocessing.Process(target=add3, args=(lock, 3, number))
  25.     pw.start()
  26.     pa.start()
  27.     print("main process end.")
执行结果:
start add1 number = 0
start add3 number = 0
add1  number = 1
add3  number = 3
add1  number = 2
add3  number = 6
add1  number = 3
add3  number = 9
add1  number = 4
add3  number = 12

加锁:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-12-11 14:53
  5. # @file :3.py


  6. import multiprocessing
  7. import time

  8. def add1(lock, value, number):
  9.     with lock:
  10.         print("start add{0} number = {1}".format(value, number))
  11.         for i in xrange(1, 5):
  12.             number += value
  13.             time.sleep(1)
  14.             print("add{0} number = {1}".format(value, number))


  15. def add3(lock, value, number):
  16.     lock.acquire()
  17.     print("start add{0} number = {1}".format(value, number))
  18.     try:
  19.         for i in xrange(1, 5):
  20.             number += value
  21.             time.sleep(1)
  22.             print("add{0} number = {1}".format(value, number))
  23.     finally:
  24.         lock.release()


  25. if __name__ == "__main__":
  26.     lock = multiprocessing.Lock()
  27.     number = 0
  28.     pw = multiprocessing.Process(target=add1, args=(lock, 1, number))
  29.     pa = multiprocessing.Process(target=add3, args=(lock, 3, number))
  30.     pw.start()
  31.     pa.start()
  32.     print("main process end.")
执行结果:
start add1 number = 0
add1  number = 1
add1  number = 2
add1  number = 3
add1  number = 4
start add3 number = 0
add3  number = 3
add3  number = 6
add3  number = 9
add3  number = 12

共享内存
python的multiprocessing模块也给我们提供了共享内存的操作

一般的变量在进程之间是没法进行通讯的,multiprocessing给我们提供了Value和Array模块,他们可以在不同的进程中共同使用

代码实例

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-12-11 15:24
  5. # @file :5.py

  6. from multiprocessing import Process, Value, Array
  7. def f(n, a, m):
  8.     n.value = 3.1415927
  9.     m = 20
  10.     for i in range(len(a)):
  11.         a[i] = -a[i]
  12.     print(m)

  13. if __name__ == '__main__':
  14.     num = Value('d', 0.0)
  15.     arr = Array('i', range(10))
  16.     m = 10
  17.     p = Process(target=f, args=(num, arr, m))
  18.     p.start()
  19.     p.join()
  20.     print(num.value)
  21.     print(arr[:])
  22.     print(m)
执行结果:
20
3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
10







阅读(1487) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~