多线程可以共享全局变量,多进程不能。多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。

#!/usr/bin/python
# -*- coding:utf-8 -*-
import os
import threading
import multiprocessing
count_thread = 0
count_process = 0 # worker function
def worker1(sign, lock):
global count_thread
lock.acquire()
count_thread += 1
print(sign, os.getpid())
lock.release() def worker2(sign, lock):
global count_process
lock.acquire()
count_process += 1
print(sign, os.getpid())
lock.release()
# Main
print('Main:',os.getpid()) # Multi-thread
record = []
lock = threading.Lock()
for i in range(5):
thread = threading.Thread(target=worker1,args=('thread',lock))
thread.start()
record.append(thread) for thread in record:
thread.join() # Multi-process
record = []
lock = multiprocessing.Lock()
for i in range(5):
process = multiprocessing.Process(target=worker2,args=('process',lock))
process.start()
record.append(process) for process in record:
process.join() print count_thread
print count_process

运行结果

('Main:', 3142)
('thread', 3142)
('thread', 3142)
('thread', 3142)
('thread', 3142)
('thread', 3142)
('process', 3148)
('process', 3149)
('process', 3150)
('process', 3151)
('process', 3152)
5
0

应该尽量避免多进程共享资源。多进程共享资源必然会带来进程间相互竞争。而这种竞争又会造成race condition,我们的结果有可能被竞争的不确定性所影响。但如果需要,我们依然可以通过共享内存和Manager对象这么做。

1) 共享内存

用Python实现的例子:

import multiprocessing

def f(n, a):
n.value = 3.14
a[0] = 5 num = multiprocessing.Value('d', 0.0)
arr = multiprocessing.Array('i', range(10)) p = multiprocessing.Process(target=f, args=(num, arr))
p.start()
p.join() print num.value
print arr[:]

这里我们实际上只有主进程和Process对象代表的进程。我们在主进程的内存空间中创建共享的内存,也就是Value和Array两个对象。对象Value被设置成为双精度数(d), 并初始化为0.0。而Array则类似于C中的数组,有固定的类型(i, 也就是整数)。在Process进程中,我们修改了Value和Array对象。回到主程序,打印出结果,主程序也看到了两个对象的改变,说明资源确实在两个进程之间共享。

2)Manager

Manager对象类似于服务器与客户之间的通信 (server-client),与我们在Internet上的活动很类似。我们用一个进程作为服务器,建立Manager来真正存放资源。其它的进程可以通过参数传递或者根据地址来访问Manager,建立连接后,操作服务器上的资源。在防火墙允许的情况下,我们完全可以将Manager运用于多计算机,从而模仿了一个真实的网络情境。下面的例子中,我们对Manager的使用类似于shared memory,但可以共享更丰富的对象类型。

import multiprocessing

def f(x, arr, l):
x.value = 3.14
arr[0] = 5
l.append('Hello') server = multiprocessing.Manager()
x = server.Value('d', 0.0)
arr = server.Array('i', range(10))
l = server.list() proc = multiprocessing.Process(target=f, args=(x, arr, l))
proc.start()
proc.join() print(x.value)
print(arr)
print(l)

Manager利用list()方法提供了表的共享方式。实际上你可以利用dict()来共享词典,Lock()来共享threading.Lock(注意,我们共享的是threading.Lock,而不是进程的mutiprocessing.Lock。后者本身已经实现了进程共享)等。 这样Manager就允许我们共享更多样的对象。

参考资料:

http://blog.csdn.net/zhaozhi406/article/details/8137670

http://www.xuebuyuan.com/1968817.html

  

  

  

最新文章

  1. twitter.common.concurrent deadline and defer
  2. USACO翻译:USACO 2014 JAN三题(1)
  3. iOS进行Basic认证与NTLM认证
  4. android绘画折线图一
  5. 基于QT的换肤整体解决方案(QSkinStyle)(提供Linux的XP风格)
  6. PAIP.提升效率----论项目知识库的建设。。
  7. mysqlbinlog恢复数据
  8. mysql update语句
  9. LINQ To SQL 处理 DateTime?
  10. line-box(转)
  11. 控制流之continue
  12. IIS asp.net环境
  13. 【转】open参数O_DIRECT的学习
  14. Java程序员的必备知识-类加载机制详解
  15. react生命周期和组件生命周期
  16. Arch Linux VMware虚拟机(新手)安装教程
  17. BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)
  18. Python数据分析Pandas库方法简介
  19. Hadoop源码阅读-HDFS-day2
  20. 05-matplotlib-直方图

热门文章

  1. Nand Flash驱动(实现初始化以及读操作)
  2. 软件工程(GZSD2015)第三次作业提交进度
  3. 201521123076 《Java程序设计》 第十四周学习总结
  4. 201521123065《java程序设计》第13周学习总结
  5. 201521123036 《Java程序设计》第11周学习总结
  6. 201521123110 《Java程序设计》第9周学习总结
  7. Mybatis第三篇【动态SQL】
  8. YYHS-NOIP2017Training0921-逆光
  9. [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
  10. jmeter按比例执行业务场景