python 进程 multiprocessing模块
一、multiprocess.process模块
p.start():启动进程,并调用该子进程中的p.run()
p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法
p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
p.is_alive():如果p仍然运行,返回True
p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程
p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
p.name:进程的名称
p.pid:进程的pid
p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)
from multiprocessing import Process
def func(name):
print('子进程:你好,',name) if __name__ == '__main__':
p = Process(target=func,args=('hsr',))
p.start()
from multiprocessing import Process
import os
def func():
print('子进程PID:',os.getpid()) if __name__ == '__main__':
p = Process(target=func)
p.start()
print('父进程PID:',os.getpid())
from multiprocessing import Process
import time
def func(*args):
print('*'*args[0])
time.sleep(5)
print('*' * args[1])
if __name__ == '__main__':
p = Process(target=func,args=(10,20))
p.start()
p.join() #主线程等待p终止
print("-------运行完了-------")
from multiprocessing import Process
import time
def func(no,*args):
print(str(no)+" :"+'*'*args[0])
time.sleep(5)
print(str(no)+" :"+'*'*args[1])
if __name__ == '__main__':
p_li = []
for i in range(10):
p_li.append(Process(target=func,args=(i,10,20)))
for i in p_li:
i.start() [i.join() for i in p_li] #让最后的print等子进程都结束了再执行
print('运行完了')
#自定义类 继承Process类
#必须实现run方法,run方法就是子进程执行的方法
#如果要参数,则实现自己的init方法,并在其中调用父类的init方法
from multiprocessing import Process
import os
class MyProcess(Process):
def __init__(self,arg1):
super().__init__()
self.arg1 = arg1
def run(self):
print("My Process:",self.pid)
print(self.arg1)
if __name__ == '__main__':
print(os.getpid())
p1 = MyProcess(4)
p1.start()
#进程间不会共享数据
from multiprocessing import Process
import os
def func():
global n
n = 0
print('pid:'+str(os.getpid())+" "+str(n))
if __name__ == '__main__':
n = 100
p = Process(target=func)
p.start()
p.join()
print('pid:'+str(os.getpid())+" "+str(n))
#守护进程
from multiprocessing import Process
import time
def func():
while 1:
time.sleep(2)
print('Good')
if __name__ == '__main__':
p = Process(target=func)
p.daemon = True #设置子进程为守护进程
p.start()
i = 10
while i>0:
print('Do something')
time.sleep(5)
i -= 1
二、进程同步
#模拟吃50个人吃5个苹果
#使用Lock对象的acquire请求锁,release释放锁
from multiprocessing import Process
from multiprocessing import Lock
import json
def eat(no,lock):
lock.acquire()
with open('info.json') as f:
dic = json.load(f)
AppleNum = dic["Apple"]
print("苹果个数:" + str(AppleNum))
if AppleNum >0:
print("%d 吃了一个苹果" %no)
AppleNum -= 1
dic["Apple"] = AppleNum
with open('info.json','w') as f:
json.dump(dic,f)
else:
print("%d 没有苹果吃了" %no)
lock.release()
if __name__ == '__main__':
lock = Lock()
for i in range(50):
Process(target=eat, args=(i,lock)).start()
from multiprocessing import Process,Semaphore
import time
import random
def grid(i,sem):
sem.acquire()
print(str(i)+'放入了格子')
time.sleep(random.randint(2,6))
print(str(i)+'拿出了格子')
sem.release()
if __name__ == '__main__':
sem = Semaphore(4)
for i in range(20):
Process(target=grid,args=(i,sem)).start()
from multiprocessing import Event
if __name__ == "__main__":
e = Event() # c创建一个事件
print(e.is_set()) # 查看一个事件的状态
e.set() #将事件的状态改为True
e.wait() #根据e.is_set()的值决定是否阻塞
print(1235455)
e.clear() #将事件的状态改为False
e.wait()
print(12323545555)
from multiprocessing import Event,Process
import time
import random
def traffic_light(e):
while 1:
if e.is_set():
e.clear()
print('\033[31m[-----------红灯-----------]\033[0m')
else:
e.set()
print('\033[32m[-----------绿灯-----------]\033[0m')
time.sleep(2) def car(e,i):
if not e.is_set():
print('%s号车在等红灯' %i)
e.wait() #阻塞直到状态改变
print('\033[0;32;40m%s号车通过\033[0m' %i) if __name__ == '__main__':
e = Event()
light = Process(target=traffic_light,args=(e,))
light.start()
for i in range(20):
time.sleep(random.random())
cars = Process(target=car,args=(e,i))
cars.start()
三、进程间通信
1.队列Queue
Queue([maxsize])
创建共享的进程队列。maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制。底层队列使用管道和锁定实现。另外,还需要运行支持线程以便队列中的数据传输到底层管道中。
Queue的实例q具有以下方法: q.get( [ block [ ,timeout ] ] )
返回q中的一个项目。如果q为空,此方法将阻塞,直到队列中有项目可用为止。block用于控制阻塞行为,默认为True. 如果设置为False,将引发Queue.Empty异常(定义在Queue模块中)。timeout是可选超时时间,用在阻塞模式中。如果在制定的时间间隔内没有项目变为可用,将引发Queue.Empty异常。 q.get_nowait( )
同q.get(False)方法。 q.put(item [, block [,timeout ] ] )
将item放入队列。如果队列已满,此方法将阻塞至有空间可用为止。block控制阻塞行为,默认为True。如果设置为False,将引发Queue.Empty异常(定义在Queue库模块中)。timeout指定在阻塞模式中等待可用空间的时间长短。超时后将引发Queue.Full异常。 q.qsize()
返回队列中目前项目的正确数量。此函数的结果并不可靠,因为在返回结果和在稍后程序中使用结果之间,队列中可能添加或删除了项目。在某些系统上,此方法可能引发NotImplementedError异常。 q.empty()
如果调用此方法时 q为空,返回True。如果其他进程或线程正在往队列中添加项目,结果是不可靠的。也就是说,在返回和使用结果之间,队列中可能已经加入新的项目。 q.full()
如果q已满,返回为True. 由于线程的存在,结果也可能是不可靠的(参考q.empty()方法)。。
from multiprocessing import Process,Queue
if __name__ == '__main__':
q = Queue(5) #创建队列
for i in range(5):
q.put(i) #放进数据
print(q.full())
#q.put(6) 此处阻塞
for i in range(5):
print(q.get()) #获取数据
print(q.empty())
#q.get() 此处阻塞
from multiprocessing import Event,Process,Queue
def produce(q):
q.put('from produce')
def comsume(q):
print(q.get())
if __name__ == '__main__':
q = Queue(5) #创建队列
pro = Process(target=produce,args=(q,))
pro.start()
com = Process(target=comsume, args=(q,))
com.start()
from multiprocessing import Process,Queue
import time
import random
def producer(name,goods,q):
for i in range(10):
time.sleep(random.randint(1,4))
print('%s生产了第%s个%s'%(name,i,goods))
q.put('第%s个%s'%(i,goods))
def comsumer(q,name):
while 1:
goods = q.get()
if goods == None:break
print('\033[31m%s买了了%s\033[0m' % (name,goods))
time.sleep(random.randint(2,6))
if __name__ == '__main__':
q = Queue(10)
p = Process(target=producer,args=('HSR','牛奶',q))
p2 = Process(target=producer, args=('TTT', '面包', q))
c = Process(target=comsumer, args=(q,'Lisi'))
c2 = Process(target=comsumer, args=(q, 'ZhangSan'))
p.start()
p2.start()
c.start()
c2.start()
p.join()
p2.join()
q.put(None)
q.put(None)
from multiprocessing import Process,JoinableQueue
import time
import random
def producer(name,goods,q):
for i in range(10):
time.sleep(random.randint(1,4))
print('%s生产了第%s个%s'%(name,i,goods))
q.put('第%s个%s'%(i,goods))
q.join() #阻塞,直到队列中的数据被全部执行完毕
def comsumer(q,name):
while 1:
goods = q.get()
if goods == None:break
print('\033[31m%s买了了%s\033[0m' % (name,goods))
time.sleep(random.randint(2,6))
q.task_done() #count - 1
if __name__ == '__main__':
q = JoinableQueue(10)
p = Process(target=producer,args=('HSR','牛奶',q))
p2 = Process(target=producer, args=('TTT', '面包', q))
c = Process(target=comsumer, args=(q,'Lisi'))
c2 = Process(target=comsumer, args=(q, 'ZhangSan'))
p.start()
p2.start()
c.daemon = True #设置为守护进程,主进程结束则子进程结束,而这里的主进程等待生产进程的结束
c2.daemon = True #生产进程又等待消费进程消费完。所以消费者消费完了就会结束进程
c.start()
c2.start()
p.join()
p2.join()
2.管道
aaarticlea/png;base64,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" alt="" />(两端在不同的进程也可以)from multiprocessing import Pipe,Process
def func(conn1,conn2):
conn2.close()
while 1:
try:
print(conn1.recv())
except EOFError:
conn1.close()
break
if __name__ == '__main__':
conn1, conn2 = Pipe()
p1 = Process(target=func,args=(conn1, conn2)) #传给不同进程的conn是不会相互影响的
p1.start()
conn1.close()
for i in range(20):
conn2.send("hi")
conn2.close()
#Pipe有数据不安全性
#管道可能出现一端的多个消费者同时取一个数据
#所以可以加上一个进程锁来保证安全性
from multiprocessing import Pipe,Process,Lock
import time
import random
def producer(con,pro,name,goods):
con.close()
for i in range(8):
time.sleep(random.randint(1,3))
print('%s生成了第%s个%s'%(name,i,goods))
pro.send('第%s个%s'%(i,goods))
pro.close()
def consumer(con,pro,name,lock):
pro.close()
while 1:
try:
lock.acquire()
goods = con.recv()
lock.release()
print('%s喝了%s'%(name,goods))
time.sleep(random.random())
except EOFError:
lock.release() #因为最后消费者通过异常来结束进程,所以最后一次的recv后面的lock.release不会执行,所以要在
#这个地方再写一个release()
con.close()
break
if __name__ == '__main__':
con, pro = Pipe()
lock = Lock()
p = Process(target=producer, args=(con,pro,'HSR','牛奶'))
c = Process(target=consumer, args=(con, pro, 'TTT',lock))
c2 = Process(target=consumer, args=(con, pro, 'TTT2',lock))
p.start()
c.start()
c2.start()
con.close()
pro.close()
3.Manager
from multiprocessing import Manager,Process
def func(dic):
dic['count'] -= 1
print(dic)
if __name__ == '__main__':
m = Manager() 创建一个Manger()
dic = m.dict({'count':100}) #变成进程共享的字典
p = Process(target=func, args=(dic,))
p.start()
p.join() #等待子进程结束
from multiprocessing import Manager,Process,Lock
def work(d,lock):
with lock: #不加锁而操作共享的数据,肯定会出现数据错乱
d['count']-=1 if __name__ == '__main__':
lock=Lock()
with Manager() as m:
dic=m.dict({'count':100})
p_l=[]
for i in range(100):
p=Process(target=work,args=(dic,lock))
p_l.append(p)
p.start()
for p in p_l:
p.join()
print(dic)
四、进程池
numprocess:要创建的进程数,如果省略,将默认使用cpu_count()的值
initializer:是每个工作进程启动时要执行的可调用对象,默认为None
initargs:是要传给initializer的参数组
p.apply(func [, args [, kwargs]]):在一个池工作进程中执行func(*args,**kwargs),然后返回结果。
'''需要强调的是:此操作并不会在所有池工作进程中并执行func函数。如果要通过不同参数并发地执行func函数,必须从不同线程调用p.apply()函数或者使用p.apply_async()''' p.apply_async(func [, args [, kwargs]]):在一个池工作进程中执行func(*args,**kwargs),然后返回结果。
'''此方法的结果是AsyncResult类的实例,callback是可调用对象,接收输入参数。当func的结果变为可用时,将理解传递给callback。callback禁止执行任何阻塞操作,否则将接收其他异步操作中的结果。''' p.close():关闭进程池,防止进一步操作。如果所有操作持续挂起,它们将在工作进程终止前完成 P.jion():等待所有工作进程退出。此方法只能在close()或teminate()之后调用 方法apply_async()和map_async()的返回值是AsyncResul的实例obj。实例具有以下方法
obj.get():返回结果,如果有必要则等待结果到达。timeout是可选的。如果在指定时间内还没有到达,将引发一场。如果远程操作中引发了异常,它将在调用此方法时再次被引发。
obj.ready():如果调用完成,返回True
obj.successful():如果调用完成且没有引发异常,返回True,如果在结果就绪之前调用此方法,引发异常
obj.wait([timeout]):等待结果变为可用。
obj.terminate():立即终止所有工作进程,同时不执行任何清理或结束任何挂起工作。如果p被垃圾回收,将自动调用此函数
#map如果要给函数传参数,只能传可迭代对象
from multiprocessing import Pool
def func(dic):
print(dic)
def func2(dic):
print(dic+2)
if __name__ == '__main__':
pool = Pool(5) #进程数,CPU核心数+1
#如果Pool()不传参数,默认是cpu核心数
pool.map(func2,range(100)) #100个任务
#这里自带join效果
pool.map(func, ['hsr','ttt']) # 2个任务
from multiprocessing import Pool
import os
import time
def func(n):
print('[pid:%s]start id:%s'%(os.getpid(),n))
time.sleep(1.5)
print('\033[31m[pid:%s]end id:%s\033[0m'%(os.getpid(),n)) if __name__ == '__main__':
pool = Pool(5)
for i in range(10):
#pool.apply(func,args=(i,)) #同步
pool.apply_async(func,args=(i,)) #异步。与主进程完全异步,需要手动close和join pool.close() # 结束进程池接收任务
pool.join() # 感知进程中的任务都执行结束
import socket
from multiprocessing import Pool def func(conn):
while 1:
conn.send(b'hello')
ret = conn.recv(1024).decode('utf-8')
if ret == 'q':
break
print(ret)
conn.close() if __name__ == '__main__':
sk = socket.socket()
sk.bind(('127.0.0.1', 8081))
sk.listen()
pool = Pool(5)
while 1:
conn, addr = sk.accept()
pool.apply_async(func,args=(conn,))
import socket
sk = socket.socket()
sk.connect(('127.0.0.1',8081))
ret = sk.recv(1024).decode('utf-8')
print(ret)
c = input().encode('utf-8')
sk.send(c)
sk.close()
from multiprocessing import Pool
def func(i):
return i**2
if __name__ == '__main__':
pool = Pool(5)
#使用map的返回值
ret = pool.map(func,range(10))
print(ret)
res_l = []
for i in range(10):
#同步
# res = pool.apply(func,args=(i,)) #apply的结果就是func的返回值
# print(res)
#异步
res = pool.apply_async(func,args=(i,)) #apply_async的结果
#这里如果直接使用res.get()来获取返回值,会阻塞,所以先将其放入列表中,后面再get
# print(res.get()) #阻塞等待func的结果
res_l.append(res)
for i in res_l:
print(i.get())
from multiprocessing import Pool
def func(i):
print('in func1')
return i**2
def func2(n):
print('in func2')
print(n)
if __name__ == '__main__':
pool = Pool(5)
pool.apply_async(func, args=(10,), callback=func2) #执行func1,把返回值作为fun2的参数执行func2
#回调函数func2在主进程中zhi'x
pool.close()
pool.join()
import requests
from multiprocessing import Pool def get(url):
ret = requests.get(url)
if ret.status_code == 200:
return ret.content.decode('utf-8'),url def call_back(args):
print(args[1] +" "+ str(len(args[0]))) url_lst = [
'http://www.cnblog.com',
'https://www.baidu.com',
'http://www.sohu.com'
] if __name__ == '__main__':
pool = Pool(5)
for i in url_lst:
pool.apply_async(get,args=(i,),callback=call_back)
pool.close()
pool.join()
python 进程 multiprocessing模块的更多相关文章
- python的multiprocessing模块进程创建、资源回收-Process,Pool
python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork( ...
- python多进程multiprocessing模块中Queue的妙用
最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个proc ...
- Python之multiprocessing模块的使用
作用:Python多进程处理模块,解决threading模块不能使用多个CPU内核,避免Python GIL(全局解释器)带来的计算瓶颈. 1.开启多进程的简单示例,处理函数无带参数 #!/usr/b ...
- python中multiprocessing模块
multiprocess模块那来干嘛的? 答:利用multiprocessing可以在主进程中创建子进程.Threading是多线程,multiprocessing是多进程. #该模块和Threadi ...
- Python(多进程multiprocessing模块)
day31 http://www.cnblogs.com/yuanchenqi/articles/5745958.html 由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分 ...
- python 多进程multiprocessing 模块
multiprocessing 常用方法: cpu_count():统计cpu核数 multiprocessing.cpu_count() active_children() 获取所有子进程 mult ...
- Python 调用multiprocessing模块下面的Process类方法(实现服务器、客户端并发)-UDP协议
#基于UDP协议的multiprocessing自定义通信 服务端: from multiprocessing import Process import socket def task(server ...
- python之multiprocessing创建进程
python的multiprocessing模块是用来创建多进程的,下面对multiprocessing总结一下使用记录. multiprocessing创建多进程在windows和linux系统下的 ...
- Python: 多进程的分布式进程multiprocessing.managers
multiprocessing.managers 在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分 ...
随机推荐
- Swoole 源码分析——基础模块之 Pipe 管道
前言 管道是进程间通信 IPC 的最基础的方式,管道有两种类型:命名管道和匿名管道,匿名管道专门用于具有血缘关系的进程之间,完成数据传递,命名管道可以用于任何两个进程之间.swoole 中的管道都是匿 ...
- 深入了解Spring
1.Bean后处理器 Spring容器提供了一个接口InitializingBean,实现这个接口的bean只要重写afterPropertiesSet()或者在XML中添加init-method属性 ...
- chrome安装插件,安装Postman
1.下载postman插件,可以自己到网上下载,也可以点击http://download.csdn.net/detail/u010246789/9528471 2.解压文件,在解压后的文件夹中找到.c ...
- MySQL 存储
1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户 ...
- php 将多个txt文件合并成
function test() { $hostdir= iconv("utf-8","gbk","C:\Users\原万里\Desktop\日常笔记& ...
- CF922B Magic Forest
CF922B Magic Forest 题意翻译 题目大意 给定一个正整数nn ,求满足如下条件的三元组(a,b,c)(a,b,c) 的个数: 1 \le a \le b \le c \le n1≤a ...
- NOIP2012 同余方程 题解
描写叙述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入仅仅有一行,包括两个正整数a, b,用一个空格隔开. 输出格式 输出仅仅有一行,包括一个正整数x0.即最小 ...
- 笔试题&面试题:给定n个数,要求比較次数1.5n同一时候找出最大值和最小值
写出一个算法,对给定的n个数的序列,返回序列中的最大和最小的数. 设计出一个算法,仅仅须要运行1.5n次比較就能找到序列中最大和最小的数吗?是否能再少? 分析:要求比較次数为1.5n,使用一般的逐个遍 ...
- hdu2688 Rotate(树状数组)
题目链接:pid=2688">点击打开链接 题意描写叙述:对一个长度为2<=n<=3000000的数组,求数组中有序对(i<j而且F[i]<F[j])的数量?其 ...
- wpf 全局异常捕获处理
/// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class App : Application { ...