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

#!/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)多进程和多线程的区别相关推荐

  1. 多进程与多线程的区别 - jihite

    多进程与多线程的区别 - jihite 时间 2014-03-16 10:16:00 博客园-所有随笔区 原文  http://www.cnblogs.com/kaituorensheng/p/360 ...

  2. 多进程与多线程的区别,和用途

    一.多进程多线程区别 多进程和多线程的区别,到底啥是多进程,啥是线程 在一个进程中也就是一个应用程序,有多个任务,线程,分别处理不同的任务,比如:这边处理ui,显示菜单图形界面,那边处理算法,计算结果 ...

  3. 多进程和多线程的区别

    多线程和多进程的区别(重点 必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催) ...

  4. 多进程和多线程的区别_关于多进程和多线程的那些事儿

    1. 引言 只有真正写过操作系统内核的人,比如大神Linus才能真正理解进程和线程的区别与联系,像我们学过操作系统课程的人都知道进程和线程的基本概念,但是仅仅是懂个皮毛而已.所以我也是纸上谈兵,根据理 ...

  5. 多进程及多线程的区别

    一.两者区别 多进程和多线程的主要区别是:线程是进程的子集(部分),一个进程可能由多个线程组成.多进程的数据是分开的.共享复杂,需要用IPC:但同步简单.多线程共享进程数据,共享简单:但同步复杂. ( ...

  6. Python多任务(8.进程与线程之间的区别以及多进程和多线程的区别 )

    1. 进程.线程的对比 进程,能够完成多任务,比如:  一台电脑上可以运行登录多个QQ 线程,能够完成多任务,比如: 一个QQ中可以和有多个聊天窗口 进程里面包含线程,线程不能够独立执行,必须依存在进 ...

  7. Python之多进程与多线程

    前言:为什么有人说 Python 的多线程是鸡肋,不是真正意义上的多线程? 看到这里,也许你会疑惑.这很正常,所以让我们带着问题来阅读本文章吧.问题: 1.Python多线程为什么耗时更长? 2.为什 ...

  8. Python编程——多进程与多线程编程(附实例)

    进程与线程的概念 进程,是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竟争计算机系统资源的基本单位.每一个进程都有一个自己的地址空间,即进程空间或(虚空间).进程空间的大小只与 ...

  9. Python之多进程和多线程详解

    1.进程的概念 一个CPU的时候运行,轮询调度实现并发执行 多CPU运行机制: 计算机程序:存储在磁盘上的可执行二进制(或其他类型)文件. 只有把它们加载到内存中,并被操作系统调用它们才会拥有其自己的 ...

最新文章

  1. “AI”战疫在行动,一文盘点百度大脑增援疫情防控的AI操作
  2. Bio-protocol第一届生物实验短视频大赛集锦(三)——软件使用篇
  3. Vivado中如何将配置程序固化到FLASH?
  4. python 读取单所有json数据写入mongodb(单个)
  5. mysql 迭代更新_MySQL、MongoDB、Redis 数据库之间的区别与使用(本章迭代更新)
  6. Linux下安装Solr
  7. C#-析构方法与构造方法 087
  8. 直接读取Excel文件数据
  9. linux下实现getch()函数的功能,linux下有没有和windows下的getch函数功能基本一样的函数?...
  10. html的跳转页面代码
  11. 华为eSight网络监控平台配置短信功能说明
  12. netware显示没有首选服务器,NetWare下服务器配置几例
  13. 抖音sdk,抖音开发api接口
  14. C++ Debug编译成XP系统下运行
  15. android播放3gp格式,Android – 无法播放任何视频(mp4 / mov / 3gp /等)?
  16. 【笔记】autoCAD无法显示文字解决方案
  17. 寒假收获(2015.1.16)
  18. 欧拉函数公式的证明以及欧拉定理的简单应用(附带证明)
  19. c语言程序设计自荐考试,C语言程序设计求职信
  20. OpenHarmony3.1适配移远EC20模组4G上网功能

热门文章

  1. java推送Comet_使用Comet4j实现消息推送
  2. kafka服务器死机消息,当kafka集群其中一台宕机后,会怎么样?
  3. 乐橙本地录像回放不了_乐橙智能锁来告诉你:你家门真的安全吗?
  4. mysql高级查询面试_高级MySQL数据库面试问题 附答案
  5. cxgrid 行合并单元格_合并单元格求和、计数、加序号
  6. 怎么在linux中查询yum,linux - 如何使用YUM列出包的内容?
  7. nodejs mysql access denied_Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’...
  8. Linux编译C没有文件名,crt1.o linux x64上没有这样的文件c编译错误
  9. 中国剩余定理证明过程
  10. mysql 生成 javabean_从MySQL快速生成JavaBean