小标
2018-11-06
来源 :
阅读 1080
评论 0
摘要:本文主要向大家介绍了Python语言多进程—multiprocessing,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。
本文主要向大家介绍了Python语言多进程—multiprocessing,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。
一、进程 python中提供多进程包:multiprocessing,支持子进程,通信,共享内存,执行不同形式的同步,提供了Process、Pipi、Lock等组件 多进程和多线程区别: 多线程使用的是CPU的一个核,适合IO密集型 多进程使用的是CPU的多个核,适合运算密集型1)multiprocessing的方法 cpu_count():统计cpu总数 active_children():获取所有子进程例子:#!/usr/bin/env python
import multiprocessing
p = multiprocessing.cpu_count()
m = multiprocessing.active_children()
print(p)
print(m)运行结果:8[]2)Process进程 创建一个Process对象:p = multiprocessing.Precess(target=worker,args=(2,)) 说明: target = 函数名字 args = 函数需要的的参数,以tuple形式传入3)Process常用方法 is_alive():判断进程是否存活 run():启动进程 start():启动进程,会自动调用run方法,常用 join(timeout=):等待进程结束或者直到超时4)Process常用属性 name:进程名字 pid:进程的pid例子:#!/usr/bin/env python
import time
import multiprocessing
def worker(interval):
time.sleep(interval)
print("hello,China")
if __name__ == "__main__":
p = multiprocessing.Process(target=worker,args=(5,))
p.start()
print(p.is_alive())
p.join(timeout=3) # 只等待3秒,如果进程还没结束,则向下执行print(p.name)
print(p.name)
print(p.pid)
print("This is end")运行结果:TrueProcess-1121764This is endhello,China实例: 多进程import time
import multiprocessing
def worker(name,interval):
print("{0} start" .format(name))
time.sleep(interval)
print("{0} end" .format(name))
if __name__ == "__main__":
print("main start")
print("The computer has {0} core" .format(multiprocessing.cpu_count()))
p1 = multiprocessing.Process(target=worker,args=("worker",2))
p2 = multiprocessing.Process(target=worker,args=("worker",3))
p3 = multiprocessing.Process(target=worker,args=("worker",4))
p1.start()
p2.start()
p3.start()
for p in multiprocessing.active_children():
print("The pid of {0} is {1}" .format(p.name,p.pid) )
print("main end")运行结果:main startThe computer has 4 coreThe pid of Process-1 is 21112The pid of Process-3 is 20536The pid of Process-2 is 2116main endworker startworker startworker startworker endworker endworker end说明:启动的多个进程之间都是相互独立存在的二、lock组件 当我们用多进程来读写文件时,如果一个写一个读同时进行时不行的,必须一个写完之后,另一个才可以读。因此需要用到一个锁机制进行控制实例1:多进程不加锁import multiprocessing
import time
def add(number,value,lock):
print("init,member = {1}".format(value,number))
for i in xrange(1,6):
number += value
time.sleep(1)
print("add {0},number = {1}".format(value,number))
if __name__ == "__main__":
lock = multiprocessing.Lock()
number = 0
p1 = multiprocessing.Process(target=add,args=(number,1,lock))
p3 = multiprocessing.Process(target=add,args=(number,3,lock))
p1.start()
p3.start()
print("main end")运行结果:main endinit,member = 0init,member = 0add 1,number = 1add 3,number = 3add 1,number = 2add 3,number = 6add 1,number = 3add 3,number = 9add 1,number = 4add 3,number = 12add 1,number = 5add 3,number = 15说明:多进程互不干扰,同时进行;进程1: 0、1、2、3、4、5;进程3: 0、3、6、9、15实例2:多进程加锁import multiprocessing
import time
def add(number,value,lock):
lock.acquire() # 获取锁
try:
print("init,member = {1}".format(value,number))
for i in xrange(1,6):
number += value
time.sleep(1)
print("add {0},number = {1}".format(value,number))
except Exception as e:
raise e
finally:
lock.release() # 释放锁
if __name__ == "__main__":
lock = multiprocessing.Lock() # 定义锁
number = 0
p1 = multiprocessing.Process(target=add,args=(number,1,lock))
p3 = multiprocessing.Process(target=add,args=(number,3,lock))
p1.start()
p3.start()
print("main end")运行结果:main endinit,member = 0add 1,number = 1add 1,number = 2add 1,number = 3add 1,number = 4add 1,number = 5init,member = 0add 3,number = 3add 3,number = 6add 3,number = 9add 3,number = 12add 3,number = 15说明:进程1和进程3,谁先抢到锁,则另一个进程只能等待抢到者执行完之后,才能执行三、共享内存 两个“同时“读写的文件,其中一个作用的结果对另外一个有影响。multiprocessing提供了Value和Array模块实例1:多进程内存共享不加锁import multiprocessing
import time
def add(number,value1):
try:
print("init,member = {1}".format(value1,number.value)) # 值的调用方式 number.value
for i in xrange(1,6):
number.value += value1
time.sleep(1)
print("add {0},number = {1}".format(value1,number.value))
except Exception as e:
raise e
if __name__ == "__main__":
lock = multiprocessing.Lock()
number = multiprocessing.Value("i",0) # Value共享内存模块
p1 = multiprocessing.Process(target=add,args=(number,1))
p3 = multiprocessing.Process(target=add,args=(number,3))
p1.start()
p3.start()
print("main end")运行结果:main endinit,member = 0init,member = 1add 1,number = 4add 3,number = 5add 1,number = 8add 3,number = 9add 1,number = 12add 3,number = 13add 1,number = 16add 3,number = 17add 1,number = 20add 3,number = 20说明:不加锁,进程1和进程3在彼此运算完之后的结果上继续运算,同时进行实例2: 多进程共享内存加锁import multiprocessing
import time
def add(number,value1,lock):
lock.acquire()
try:
print("init,member = {1}".format(value1,number.value))
for i in xrange(1,6):
number.value += value1
time.sleep(1)
print("add {0},number = {1}".format(value1,number.value))
except Exception as e:
raise e
finally:
lock.release()
if __name__ == "__main__":
lock = multiprocessing.Lock()
number = multiprocessing.Value("i",0)
p1 = multiprocessing.Process(target=add,args=(number,1,lock))
p3 = multiprocessing.Process(target=add,args=(number,3,lock))
p1.start()
p3.start()
print("main end")运行结果:main endinit,member = 0add 1,number = 1add 1,number = 2add 1,number = 3add 1,number = 4add 1,number = 5init,member = 5add 3,number = 8add 3,number = 11add 3,number = 14add 3,number = 17add 3,number = 20说明:加锁,进程3等待进程1执行完毕之后,在前者的结果上,继续执行四、多进程Manager 一般实现的数据共享的方式只有两种结构Value和Array。Python中提供了强大的Manage专门用来做数据共享的,其支持的类型非常多,包括,Value, Array,list,dict, Queue, Lock等例:支持字典和列表类型import multiprocessing
def worker(d,l):
l += range(11,16) # 返回一个列表序列的特殊写法
for i in xrange(1,6):
key = "key {0}".format(i)
value = "value {0}".format(i)
d[key] = value
if __name__ == "__main__":
manager = multiprocessing.Manager()
l = manager.list()
d = manager.dict()
p = multiprocessing.Process(target=worker,args=(d,l))
p.start()
p.join()
print(d)
print(l)
print("main end")运行结果:{'key 1': 'value 1', 'key 2': 'value 2', 'key 3': 'value 3', 'key 4': 'value 4', 'key 5': 'value 5'}[11, 12, 13, 14, 15]main end五、进程池 Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程阻塞和非阻塞Pool.apply_async: 非阻塞,定义的进程池进程最大数可以同时执行Pool.apply:阻塞,一个进程结束,释放回进程池,下一个进程才可以开始例1:非阻塞import multiprocessing
import time
def worker(msg):
print("###### start {0}#######".format(msg))
time.sleep(1)
print("###### end {0}#######".format(msg))
if __name__ == "__main__":
print("main start")
pool = multiprocessing.Pool(processes=3)
for i in xrange(1,10):
msg = "hello {0}".format(i)
pool.apply_async(func=worker,args=(msg,)) # pool.apply_async()非阻塞型
pool.close()
pool.join() #调用join之前,先调用close函数,否则会出错。执行完close后如果没有新的进程加入到pool,则join函数等待所有子进程结束
print("main end")运行结果:main start###### start hello 1############# start hello 2############# start hello 3############# end hello 1############# start hello 4############# end hello 2############# start hello 5############# end hello 3############# start hello 6############# end hello 4############# start hello 7############# end hello 5############# start hello 8############# end hello 6############# start hello 9############# end hello 7############# end hello 8############# end hello 9#######main end说明:一开始启动3个进程,之后先关闭一个进程,再补充另外一个进程进来,始终保持3个,直至结束例2:阻塞型import multiprocessing
import time
def worker(msg):
print("###### start {0}#######".format(msg))
time.sleep(1)
print("###### end {0}#######".format(msg))
if __name__ == "__main__":
print("main start")
pool = multiprocessing.Pool(processes=3)
for i in xrange(1,10):
msg = "hello {0}".format(i)
pool.apply(func=worker,args=(msg,)) # pool.apply() 阻塞型
pool.close()
pool.join()
print("main end")运行结果:main start###### start hello 1############# end hello 1############# start hello 2############# end hello 2############# start hello 3############# end hello 3############# start hello 4############# end hello 4############# start hello 5############# end hello 5############# start hello 6############# end hello 6############# start hello 7############# end hello 7############# start hello 8############# end hello 8############# start hello 9############# end hello 9#######main end说明:每次只能启动一个进程,启动新进程前,需关闭老进程
本文由职坐标整理并发布,希望对同学们学习Python有所帮助,更多内容请关注职坐标编程语言Python频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号