python(33)多进程和多线程的区别
多线程可以共享全局变量,多进程不能。多线程中,所有子线程的进程号相同;多进程中,不同的子进程进程号不同。
#!/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_threadlock.acquire()count_thread += 1print(sign, os.getpid())lock.release()def worker2(sign, lock):global count_processlock.acquire()count_process += 1print(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 multiprocessingdef f(n, a):n.value = 3.14a[0] = 5num = 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 multiprocessingdef f(x, arr, l):x.value = 3.14arr[0] = 5l.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
转载于:https://www.cnblogs.com/lovychen/p/6478161.html
python(33)多进程和多线程的区别相关推荐
- 多进程与多线程的区别 - jihite
多进程与多线程的区别 - jihite 时间 2014-03-16 10:16:00 博客园-所有随笔区 原文 http://www.cnblogs.com/kaituorensheng/p/360 ...
- 多进程与多线程的区别,和用途
一.多进程多线程区别 多进程和多线程的区别,到底啥是多进程,啥是线程 在一个进程中也就是一个应用程序,有多个任务,线程,分别处理不同的任务,比如:这边处理ui,显示菜单图形界面,那边处理算法,计算结果 ...
- 多进程和多线程的区别
多线程和多进程的区别(重点 必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催) ...
- 多进程和多线程的区别_关于多进程和多线程的那些事儿
1. 引言 只有真正写过操作系统内核的人,比如大神Linus才能真正理解进程和线程的区别与联系,像我们学过操作系统课程的人都知道进程和线程的基本概念,但是仅仅是懂个皮毛而已.所以我也是纸上谈兵,根据理 ...
- 多进程及多线程的区别
一.两者区别 多进程和多线程的主要区别是:线程是进程的子集(部分),一个进程可能由多个线程组成.多进程的数据是分开的.共享复杂,需要用IPC:但同步简单.多线程共享进程数据,共享简单:但同步复杂. ( ...
- Python多任务(8.进程与线程之间的区别以及多进程和多线程的区别 )
1. 进程.线程的对比 进程,能够完成多任务,比如: 一台电脑上可以运行登录多个QQ 线程,能够完成多任务,比如: 一个QQ中可以和有多个聊天窗口 进程里面包含线程,线程不能够独立执行,必须依存在进 ...
- Python之多进程与多线程
前言:为什么有人说 Python 的多线程是鸡肋,不是真正意义上的多线程? 看到这里,也许你会疑惑.这很正常,所以让我们带着问题来阅读本文章吧.问题: 1.Python多线程为什么耗时更长? 2.为什 ...
- Python编程——多进程与多线程编程(附实例)
进程与线程的概念 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位.每一个进程都有一个自己的地址空间,即进程空间或(虚空间).进程空间的大小只与 ...
- Python之多进程和多线程详解
1.进程的概念 一个CPU的时候运行,轮询调度实现并发执行 多CPU运行机制: 计算机程序:存储在磁盘上的可执行二进制(或其他类型)文件. 只有把它们加载到内存中,并被操作系统调用它们才会拥有其自己的 ...
最新文章
- “AI”战疫在行动,一文盘点百度大脑增援疫情防控的AI操作
- Bio-protocol第一届生物实验短视频大赛集锦(三)——软件使用篇
- Vivado中如何将配置程序固化到FLASH?
- python 读取单所有json数据写入mongodb(单个)
- mysql 迭代更新_MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)
- Linux下安装Solr
- C#-析构方法与构造方法 087
- 直接读取Excel文件数据
- linux下实现getch()函数的功能,linux下有没有和windows下的getch函数功能基本一样的函数?...
- html的跳转页面代码
- 华为eSight网络监控平台配置短信功能说明
- netware显示没有首选服务器,NetWare下服务器配置几例
- 抖音sdk,抖音开发api接口
- C++ Debug编译成XP系统下运行
- android播放3gp格式,Android – 无法播放任何视频(mp4 / mov / 3gp /等)?
- 【笔记】autoCAD无法显示文字解决方案
- 寒假收获(2015.1.16)
- 欧拉函数公式的证明以及欧拉定理的简单应用(附带证明)
- c语言程序设计自荐考试,C语言程序设计求职信
- OpenHarmony3.1适配移远EC20模组4G上网功能
热门文章
- java推送Comet_使用Comet4j实现消息推送
- kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?
- 乐橙本地录像回放不了_乐橙智能锁来告诉你:你家门真的安全吗?
- mysql高级查询面试_高级MySQL数据库面试问题 附答案
- cxgrid 行合并单元格_合并单元格求和、计数、加序号
- 怎么在linux中查询yum,linux - 如何使用YUM列出包的内容?
- nodejs mysql access denied_Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’...
- Linux编译C没有文件名,crt1.o linux x64上没有这样的文件c编译错误
- 中国剩余定理证明过程
- mysql 生成 javabean_从MySQL快速生成JavaBean