进程池
进程池
1.共享内存
from multiprocessing import Manager,Process,Lock def work(d,lock): with lock: d['count']-=1 # temp=d['count'] # d['count']=temp-1 if __name__=='__main__': m=Manager() d=m.dict({"count":100}) lock=Lock() p_l=[] for i in range(100): p=Process(target=work,args=(d,lock)) p_l.append(p) p.start() for p in p_l: p.join() print(d)
2.进程池
(1)同步调用与阻塞:这是两个概念
同步调用:提交完任务后,在原地等待任务结束,其它任务也进不来,一旦结束可以立刻拿到结果
阻塞:正在运行的进程遇到io则进入阻塞状态
(2)异步调用和非阻塞:两个不同的概念
异步调用:提交完任务后,不会在原地等待任务结束,会继续提交下一次任务,等到所有任务结束后,才会get 到结果
非阻塞:可能是运行状态,可能是就绪状态
(3)只有在进程数目不是很多的情况可以用
(4)一般操作系统有几个核就开几个进程
from multiprocessing import Pool import os,time,random def work(n): print('%s is working'%os.getpid()) time.sleep(random.randint(1,3)) #阻塞 return n**2 if __name__=='__main__': p=Pool(4) objs=[] for i in range(10): # res=p.apply(work,args=(i,)) #同步调用和阻塞是两个概念,同步调用:提交完任务后,在原地等待任务结束,其它任务也进不来,一旦结束可以立刻拿到结果 # print(res) obj=p.apply_async(work,args=(i,)) #异步调用 objs.append(obj) p.close() p.join() # print(obj) for obj in objs: print(obj.get())
3.回调函数
主进程负责干回调函数的活
import requests import os,time from multiprocessing import Pool # 'http://www.baidu.com' def get(url): print('%s GET %s'%(os.getpid(),url)) response = requests.get(url) if response.status_code==200: print('%s done %s'%(os.getpid(),url)) return {'url':url,'text':response.text} def parse(dic): print('%s PARSE %s'%(os.getpid(),dic['url'])) time.sleep(1) res='%s:%s'%(dic['url'],len(dic['text'])) with open('db.txt','a') as f: f.write(res) if __name__=='__main__': urls = [ 'https://www.baidu.com', 'https://www.python.org', 'https://www.openstack.org', 'https://help.github.com/', 'http://www.sina.com.cn/' ] p=Pool(2) objs=[] for url in urls: obj=p.apply_async(get,args=(url,),callback=parse) objs.append(obj) p.close() p.join() # 解析的时间比下载执行的速度快,在下载的过程中,一个下载好后直接解析
4.集中式与分布式
(1)集中式开发:是将所有数据存放在中央服务器上,基于网络连接服务器,工作时从服务端取出数据,工作完之后将数据提交到服务端保存。
优点:减少了硬件与软件成本
缺点:①如果网络出现异常或者网速不好,直接影响工作效率;
②如果服务器崩溃了,基本上就不能工作了;
③安全度不高,数据放在一个中央服务器中,被黑客攻击时,容易丢失重要数据
(2)分布式开发:有一个作为交换信息的基本服务器,没有它也可以工作,只是比较麻烦,而每一台电脑有自己独立的开发环境,不需要联网,本地直接运行,相对集中式安全系数高很多。

浙公网安备 33010602011771号