当前位置: 首页 > news >正文

python中多线程和多进程的区别_python 多线程和多进程的区别 mutiprocessing theading...

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

ContractedBlock.gif

ExpandedBlockStart.gif

1 #!/usr/bin/python

2 #-*- coding:utf-8 -*-

3 importos4 importthreading5 importmultiprocessing6 count_thread =07 count_process =08

9 #worker function

10 defworker1(sign, lock):11 globalcount_thread12 lock.acquire()13 count_thread += 1

14 print(sign, os.getpid())15 lock.release()16

17 defworker2(sign, lock):18 globalcount_process19 lock.acquire()20 count_process += 1

21 print(sign, os.getpid())22 lock.release()23 #Main

24 print('Main:',os.getpid())25

26 #Multi-thread

27 record =[]28 lock =threading.Lock()29 for i in range(5):30 thread = threading.Thread(target=worker1,args=('thread',lock))31 thread.start()32 record.append(thread)33

34 for thread inrecord:35 thread.join()36

37 #Multi-process

38 record =[]39 lock =multiprocessing.Lock()40 for i in range(5):41 process = multiprocessing.Process(target=worker2,args=('process',lock))42 process.start()43 record.append(process)44

45 for process inrecord:46 process.join()47

48

49 printcount_thread50 print count_process

View Code

运行结果

('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实现的例子:

ContractedBlock.gif

ExpandedBlockStart.gif

1 importmultiprocessing2

3 deff(n, a):4 n.value = 3.14

5 a[0] = 5

6

7 num = multiprocessing.Value('d', 0.0)8 arr = multiprocessing.Array('i', range(10))9

10 p = multiprocessing.Process(target=f, args=(num, arr))11 p.start()12 p.join()13

14 printnum.value15 print arr[:]

View Code

这里我们实际上只有主进程和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,但可以共享更丰富的对象类型。

ContractedBlock.gif

ExpandedBlockStart.gif

1 importmultiprocessing2

3 deff(x, arr, l):4 x.value = 3.14

5 arr[0] = 5

6 l.append('Hello')7

8 server =multiprocessing.Manager()9 x = server.Value('d', 0.0)10 arr = server.Array('i', range(10))11 l =server.list()12

13 proc = multiprocessing.Process(target=f, args=(x, arr, l))14 proc.start()15 proc.join()16

17 print(x.value)18 print(arr)19 print(l)

View Code

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

相关文章:

  • super关键字
  • c盘清理工具_学会这几招,让你的电脑从此告别C盘空间不足
  • Python 之 threading
  • c++自底向上算符优先分析_C语言运算符及其优先级汇总表口诀
  • dump分析工具_百因必有果,JVM调优(工具篇)建议收藏
  • java设计模式之代理模式模式总结
  • c语言左对齐_C语言经典100题(9)
  • Java连接SqlServer 2008数据库
  • 没有找到合适的方法来重写_你现在还没有女朋友?4个方法步骤,让你轻松快速找到女朋友...
  • Android JNI之数据类型
  • python爬带用户名密码的网页_Python爬虫带用户名密码登录
  • 醒醒吧少年,只用Cucumber不能帮助你BDD
  • gradle配置到阿里云_ESXI申请阿里云SSL证书并配置
  • Oracle用户和权限
  • .net core 源码_ASP.NET Core之Identity源码学习
  • php的引用
  • 0基础学习移动端适配
  • CEF与代理
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • PaddlePaddle-GitHub的正确打开姿势
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • yii2权限控制rbac之rule详细讲解
  • 基于遗传算法的优化问题求解
  • 基于游标的分页接口实现
  • 前端js -- this指向总结。
  • 使用Gradle第一次构建Java程序
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 一天一个设计模式之JS实现——适配器模式
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • 带你开发类似Pokemon Go的AR游戏
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • "无招胜有招"nbsp;史上最全的互…
  • #include到底该写在哪
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • #我与Java虚拟机的故事#连载12:一本书带我深入Java领域
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (8)STL算法之替换
  • (Oracle)SQL优化技巧(一):分页查询
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (十八)三元表达式和列表解析
  • (十三)Flask之特殊装饰器详解
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)拼包函数及网络封包的异常处理(含代码)
  • . Flume面试题
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net 获取url的方法
  • .Net的DataSet直接与SQL2005交互
  • .NET开源快速、强大、免费的电子表格组件
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .Net转Java自学之路—基础巩固篇十三(集合)