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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/541801.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java FilterInputStream reset()方法与示例

FilterInputStream类的reset()方法 (FilterInputStream Class reset() method) reset() method is available in java.io package. reset()方法在java.io包中可用。 reset() method is used to reset this FilterInputStream to the position set by the most recent call of m…

不同php文件,php-不同文件夹的不同登录(会话)

我有一个Web服务,需要用户登录并创建标准$_SESSION [‘XXX’]个用户变量.我想为应用程序创建一个“演示”,因此为它创建了另一个文件夹.相同的代码在那里,除了数据库以外的所有东西.问题是,当用户登录这两个帐户之一时,它可以访问两个帐户.因此,如果他登录了演示应用程序,它将使…

Java Hashtable containsValue()方法与示例

哈希表类containsValue()方法 (Hashtable Class containsValue() method) containsValue() method is available in java.util package. containsValue()方法在java.util包中可用。 containsValue() method is used to check whether this table Hashtable associated one or m…

php session redis db,php session redis 配置

具体环境:一台apachephp的服务器(yum安装remi源及配置 httpd-2.2.15 php-5.4.45)一台redis服务器(yum安装remi源及配置 redis-3.2.6)保证apache服务器可以访问redis服务器的6379端口具体步骤:1、在apachephp服务器上安装redis扩展点击(此处)折叠或打开yu…

sigprocmask, sigpending, sigsuspend的用法

sigset_t set sigemptyset(&set) :清空阻塞信号集合变量 sigfillset(&set) :添加所有的信号到阻塞集合变量里 sigaddset(&set,SIGINT):添加单一信号到阻塞信号集合变量 sigdelset(&set,SIGINT):从阻塞信号集合变量中删除单一信号 void handler(int …

Java Calendar getDisplayName()方法与示例

日历类的getDisplayName()方法 (Calendar Class getDisplayName() method) getDisplayName() method is available in java.util package. getDisplayName()方法在java.util包中可用。 getDisplayName() method is used to return string denotation of the given calendar fie…

matlab dir数,DIR - matlab函数

DIR List directory.DIR directory_name lists the files in a directory. Pathnames andwildcards may be used. For example, DIR *.m lists all the M-filesin the current directory.D DIR(‘directory_name‘) returns the results in an M-by-1structure with the field…

(四)其他的说明

2019独角兽企业重金招聘Python工程师标准>>> 关于日志,主要是利用aop来实现的。cn.demoframe.test.frame.service.LogAspect,这里在方法前做了个切面setReqReachTime,设置了一个请求达到时间。接下来还有个切面,是在co…

Java LocalDate类| 带示例的compareTo()方法

LocalDate类compareTo()方法 (LocalDate Class compareTo() method) compareTo() method is available in java.time package. compareTo()方法在java.time包中可用。 compareTo() method is used to compare this LocalDate object to the given object. compareTo()方法用于将…

vm中linux物理内存不足解决方案

为什么80%的码农都做不了架构师?>>> 之前创建的一个center os,默认是8GB,经过一顿折磨,装jdk,tomcat,redis,mycat,nginx,mysql,hadoop...终于,内存不足了,在使用docker build某镜像的时候。迭代懵逼了&am…

matlab7.0 6.5,任何处理matlab6.5与7.0.1的兼容问题

mdl文件在6.5里面做的,但是到了7.0里面却打不开,下面就是相关信息:Warning: Unable to load model file d:\MATLAB7\work\*.mdl. Run "bdclose all; set_param(0, CharacterEncoding, Enc)" where Enc is one of windows-1252, I…

Java BigInteger类| 带有示例的减去()方法

BigInteger类减去()方法 (BigInteger Class subtract() method) subtract() method is available in java.math package. exclude()方法在java.math包中可用。 subtract() method is used to subtract the given value from the value of this BigInteger. exclude()方法用于从…

php删除第一个字母,php – 正在上传的文件将第一个字母切断

我正在将网站从具有WS2003,IIS6,PHP 5.2的服务器迁移到具有WS2008,IIS7和PHP 5.3的服务器我有一个html表单,上传文件到网站.if(isset($_POST["Upload"])){echo "";print_r($_POST);print_r($_FILES);echo "";}?>在旧服务器上工作得很好,但在…

.7z.001,.7z.002这样的文件如何解压

1 如图所示,压缩分卷没有显示关联的软件来打开,Winrar右击也无法解压 2 可以使用7-ZIP软件打开该文件,然后选择提取(相当于Winrar的解压),然后选择提取路径,默认是同一个文件夹,点击…

二进制 |_元二进制搜索| 单边二元搜索

二进制 & |Meta Binary Search is a one-sided binary search where we work on the index using bit manipulation. We are to find the target index by using bit manipulation like the below example where the algorithm is explained. 元二进制搜索是一种单面二进制…

codeMirror配置

介绍 CodeMirror是一款在线的支持语法高亮的代码编辑器。官网:http://codemirror.net/ 下载后,解压开到的文件夹中,lib下是放的是核心库和核心css,模式下放的是各种支持语言的语法定义,主题目录下是支持的主题样式。一…

应梦框架9.0框架_.Net框架能力问题和解答

应梦框架9.0框架This section contains Aptitude Questions and Answers on .Net Framework. 本节包含有关.Net Framework的能力问题和解答。 1) There are the following options are given below, what are parts of the .NET Framework? FCL (Framework Class Library)Web…

php中文网视频放不了,【杂谈】看php中文网视频课程的正确姿势!

看在线课程如何集中精力学习?ki4网为你分享看ki4网视频课程的正确姿势!不谈理论给些实用建议,可以根据你的情况多尝试,看看哪条对你有用!1、选一门自己有兴趣而且教师讲得好的课程。(点击学习:ki4网视频教程…

算法笔记_065:分治法求逆序对(Java)

目录 1 问题描述 2 解决方案 2.1 蛮力法 2.2 分治法(归并排序) 1 问题描述 给定一个随机数数组,求取这个数组中的逆序对总个数。要求时间效率尽可能高。 那么,何为逆序对? 引用自百度百科: 设 A 为一个有 n…

c#copyto_String.CopyTo()方法以及C#中的示例

c#copytoC#String.CopyTo()方法 (C# String.CopyTo() Method) String.CopyTo() method is used to copy a specified number of characters from given indexes of the string to the specified position in a character array. String.CopyTo()方法用于将指定数量的…