python3中的进程
由于GIL的存在,python中的多线程并不是真正的多线程。
如果想要充分的使用多核CPU的资源,在python中大部分情况需要使用多进程。
在计算机中,进程与进程这之间在内存中是相互独立的,是两块完全不同的内存空间,而且相互之间没有任何联系。
在线程之中,在全局定义一个变量,所有的线程都是共用的,但是不同的进程之间的数据则不是公有的。
multiprocessing包是python中的多进程管理包。
与threading.Thread类似,myltiprocessing模块可以利用multiprocessing.Process对象来创建一个子进程。
multiprocessing的很大一部分用法与threading使用同一套API。
Process对象与Thread对象的用法相同,也有start(),run()和join()的方法。
此外multiprocessing包中也有Lock,Event,Smaphore,Condition类,这些对象可以像多线程那样,通过参数传递给各个进程,以实现同步进程。
1.进程的创建:
大家在用chrome浏览器浏览网页的时候,打开任务管理器,会看到chrome的进程会不止一个,那么怎么在在一段py程序里面开辟一个子进程呢??
python中子进程的创建有两种方法:
1.通过Process类调用
import multiprocessing
import time
def func():
	print("hello world------>",time.ctime())
	time.sleep(2)	#让系统休眠2S
	print("func ending------>",time.ctime())
if __name__ == "__main__":
	p1=multiprocessing.Process(target=func,args=())	#实例化一个进程
	p1.start()	#启动进程
	print("ending------>",time.ctime())		#计算程序执行所花费的时间
这样就创建一个进程,如果电脑的CPU是多核的话,这两个程序就会并行执行。
执行程序,程序最后一句"ending"和"hello world"会同进打印在屏幕上,然后程序休眠2s,又会在屏幕上打印一句"func ending",程序执行结束。
在程序执行期间,打开任务管理器,会看到进程列表中有两个python.exe的进程,等到程序执行完成,这两个python.exe的进程又会消失。
程序执行结果:
ending------> Thu Jul 20 15:56:17 2017
hello world------> Thu Jul 20 15:56:17 2017
func ending------> Thu Jul 20 15:56:19 2017
2.继承Process类调用
from multiprocessing import Process
import time
class MyProcess(Process):	#定义一个类,这个类继承multiprocessing.Process这个类
	def __init__(self,i):
		super(MyProcess,self).__init__()
		self.i=i
	def run(self):
		print("%s hello python------>"%self.i,time.ctime())
		time.sleep(2)
if __name__=="__main__":
	p_list=[]
	for i in range(3):
		p1=MyProcess(i)	#实例化进程
		p1.start()		#启动进程
		p_list.append(p1)
	for item in p_list:
		item.join()		#阻塞主进程,全子进程执行完毕再执行主进程
	print("ending------>",time.ctime())		#计算程序执行所花费的时间
利用类的继承,创建了3个进程,这三个进程同时在屏幕在打印自身的编号及一句话,然后程序休眠2s后,又会打印结束话语。
在程序的执行过程中,查看系统进程列表,会看到python解释器的进程编号:
E:\py_code>tasklist | findstr python
python.exe                    5760 Console                    1     11,524 K
python.exe                    3488 Console                    1     11,616 K
python.exe                    6900 Console                    1     11,672 K
python.exe                    4384 Console                    1     11,636 K
程序执行结果:
1 hello python------> Thu Jul 20 16:05:07 2017
2 hello python------> Thu Jul 20 16:05:07 2017
0 hello python------> Thu Jul 20 16:05:07 2017
ending------> Thu Jul 20 16:05:09 2017
2.进程的使用方法:
来看下面的例子:
让系统执行一段范围内的累加和累乘操作,计算CPU执行这两个操作所花的时间。
第一种方式:正常的定义两个函数,然后执行程序。
def func1(x):
    res1=0
    for i in range(x):
        res1 += i   #累加计算的结果
    return res1
def func2(y):
    res2=1
    for i in range(1,y):
        res2 *= i    #累乘计算的结果
    return res2
s1=time.time()
func1(100000000)	#执行累加函数
func2(100000)		#执行累乘函数
s2=time.time()
print("cost time:%s"%(s2-s1))	#计算程序执行所花费的时间
程序返回结果:
cost time:9.273045301437378
第二种方式,使用程序执行另外两个进程,分别调用系统资源来运算,计算CPU所花费的时间。
from multiprocessing import Process
import time
def func1(x):
    res1=0
    for i in range(x):
        res1 += i
    return res1
def func2(y):
    res2=1
    for i in range(1,y):
        res2 *= i
    return res2
if __name__=="__main__":
    t1=time.time()
    p1=Process(target=func1,args=(100000000,))  #实例化进程p1
    p1.start()	#启动进程p1
    p2=Process(target=func2,args=(100000,))     #实例化进程p2
    p2.start()	#启动进程pp2
    p1.join()
    p2.join()
    print("ending")
    t2=time.time()
    print("cost time:%s"%(t2-t1))		#计算程序运行所花费的时间
执行程序,查看系统的任务管理器,可以看到程序在运行的过程中,生成了三个进程。
E:\py_code>tasklist | findstr python
python.exe                    6520 Console                    1     11,536 K
python.exe                    4340 Console                    1     11,612 K
python.exe                    6200 Console                    1     12,240 K
程序执行结果:
ending
cost time:5.437908697128296
可以看到,第二段代码里面有三个进程(一个主进程和两个子进程p1,p2),
同时在执行这两个函数,所以CPU在执行这两个运行的时候所花的时间会少一些的原因。
3.python中,多进程的优缺点:
优点:
    可以利用多核,以实现并形运算
缺点:
    1.浪费的系统资源比较多
    2.进程之间的通信比较困难
4.multiprocessing中的Process类中内置方法及用法:
在系统的提示符下,导入multiprocessing模块,使用:
import multiprocessing
查看这个模块的内置的方法:
help(multiprocessing.Process)
multiprocessing.Process内置方法:
构造方法:
    group               线程组
	target              要执行的方法
	name                进程的名
	args/kwargs         执行过程中要传入的参数 
实例方法:
	is_alive()          测试进程是否在运行
	join([timeout])     阻塞当前上下文环境的进程,直到调用此方法的进程终止或到达指定的timeout
	start()             进程准备就绪,等待CPU调度
	run()               start()调用run方法,如果实例进程未制定传入target时,这start执行默认的run()方法
	terminate()         不管任务是否完成,立即停止工作进程 
属性:
	deamon              和线程的setDeamon功能一样
	name                进程的名字
	pid(ident)          进程号
	ppid                进程的父进程号
Process内置方法的用法:
代码如下:
from multiprocessing import Process
import os
import time
def info(name):
    print("process name:",name)		#打印当前进程的进程名
    print("parent process:",os.getppid())		#打印当前进程的父进程ID号
    print("process:",os.getpid())	#打印当前进程的进程ID号
    print("---------")
    time.sleep(10)
def foo(name):
    info(name)
if __name__=="__main__":
    info("main process")
    p1=Process(target=info,args=("process1",))
    p1.start()
    p1.join()
    p2=Process(target=foo,args=("process2",))
    p2.start()
    p2.join()
    print("ending")
程序执行过程中,打开系统的任务管理器,查找python的进程可以看到:
E:\py_code>tasklist | findstr python
python.exe                    2424 Console                    1     11,536 K
python.exe                    5360 Console                    1     11,632 K
python.exe                    2532 Console                    1     11,664 K
执行程序,返回结果如下:
process name: main process line
parent process: 628
process: 2424
---------
process name: process1
parent process: 2424
process: 2532
---------
process name: process2
parent process: 2424
process: 5360
---------
ending
可以看到process1和process2的进程名和进程号,这两个进程的父进程号都是一样的,都是主进程的进程号。
5.注意事项
需要注意的是,python的进程之间的切换,耗费的系统资源比线程的切换耗费的资源多得多。
python3中的进程的更多相关文章
- python中的进程、线程(threading、multiprocessing、Queue、subprocess)
		
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
 - Python3中Urllib库基本使用
		
什么是Urllib? Python内置的HTTP请求库 urllib.request 请求模块 urllib.error 异常处理模块 urllib.par ...
 - Python3中的yield from语法
		
Python3中的yield from语法 by Kay Zheng Tags: python, 协程, generator 30 March 2014 2016-2-23 更新 這篇文章是兩年前寫的 ...
 - Python中的进程池与线程池(包含代码)
		
Python中的进程池与线程池 引入进程池与线程池 使用ProcessPoolExecutor进程池,使用ThreadPoolExecutor 使用shutdown 使用submit同步调用 使用su ...
 - Java中的进程和线程
		
Java中的进程与线程 一:进程与线程 概述:几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进程运行时,内部可能包括多个顺序执行流,每个顺序执行流就是 ...
 - Java中的进程与线程(总结篇)
		
详细文档: Java中的进程与线程.rar 474KB 1/7/2017 6:21:15 PM 概述: 几乎任何的操作系统都支持运行多个任务,通常一个任务就是一个程序,而一个程序就是一个进程.当一个进 ...
 - Python3中的字符串函数学习总结
		
这篇文章主要介绍了Python3中的字符串函数学习总结,本文讲解了格式化类方法.查找 & 替换类方法.拆分 & 组合类方法等内容,需要的朋友可以参考下. Sequence Types ...
 - 获取系统中所有进程&线程信息
		
读书笔记--[计算机病毒解密与对抗] 目录: 遍历进程&线程程序 终止进程 获取进程信息 获取进程内模块信息 获取进程命令行参数 代码运行环境:Win7 x64 VS2012 Update3 ...
 - Linux 系统中僵尸进程
		
Linux 系统中僵尸进程和现实中僵尸(虽然我也没见过)类似,虽然已经死了,但是由于没人给它们收尸,还能四处走动.僵尸进程指的是那些虽然已经终止的进程,但仍然保留一些信息,等待其父进程为其收尸.配图源 ...
 
随机推荐
- [51nod1743]雪之国度
			
雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路. 雪之女王赋予了每一座城市不同的能量,其中第i座城市被赋予 ...
 - CDOJ 1330 柱爷与远古法阵【高斯消元,卡精度】
			
柱爷与远古法阵 Time Limit: 125/125MS (Java/Others) Memory Limit: 240000/240000KB (Java/Others) Submit S ...
 - .28-浅析webpack源码之compiler.resolvers
			
原本该在过WebpackOptionsApply时讲解这个方法的,但是当时一不小心过掉了,所以在这里补上. compiler.resolvers 该对象的三个方法均在WebpackOptionsApp ...
 - YUI 阻止动态css加载
			
skinnable动态加载 在YUI Module中,经常采用skinnable参数来动态加载css,如: YUI().use('w-paginator', function(Y) { }, requ ...
 - linux安装navicat全程记录
			
国庆期间自己在试着用linux(ubuntu),献上navicat安装方法,以及很多教程里没有写的一些小东西 step1: 去navicat官网下载安装包,网址:http://www.navicat. ...
 - 《You dont know JS》值相关总结
			
值 一:和数组相关的几个需要关注的点 数组可以容纳任何类型的值. 数组声明时不需要预先设置大小.可以动态改变. 使用delete运算符可以将数组中的某个元素删除,但是这个操作不会改变数组的length ...
 - WPF与Win32互操作
			
一.WPF如何使用HWND 当您创建WPF Window时,WPF会创建顶级HWND,并使用HwndSource将Window及其WPF内容放入HWND中.应用程序中其余的WPF内容共享此单个HWND ...
 - [转] 分享一个快的飞起的maven的settings.xml文件
			
<?xml version="1.0"?> <settings> <localRepository>/home/yizhen/.m2/repos ...
 - TCP三次握手和四次挥手过程
			
1.三次握手 (1)三次握手的详述 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server段发生ACK报文, ...
 - io调度策略noop的理解
			
io电梯算法,网上一堆,在此不再赘述. 手上有几块厂商提供的sas的ssd,做如下实验. 考虑到没有磁头移动,ssd一般采用noop的io调度策略,结果看到如下的iostat测试数据: Device: ...