Python Day35进程池,回调函数
一、进程池:
什么是进程池:创建一定数量的进程个数
同步和异步:提交任务的两种方式。
Pool:创建进程池和控制进程的数目,默认的个数是根据CPU的核数
apply:传入两个参数,第一个是指定任务。向进程池提交一个任务,实现了串行和同步调用。结束任务后,立马会拿到结果。
开启的进程数目有几个,就会有几个pid。
什么是同步调用:提交一个任务,等到任务结束后才能执行下一个任务。
import multiprocessing import time import random import os def walk(n): print('%s is walking'%os.getpid()) time.sleep(random.random()) return n if __name__=='__main__': p=multiprocessing.Pool(4) for i in range(10): q=p.apply(walk,args=(i,)) print(q)
apply_async:向进程池提交任务,提交完任务后就不管了,只管提交任务,不能直接执行任务。实现了一个并发和恶异步调用
执行方法:先close:关闭任务,好让任务结束
然后join:等待一个进程池不在提交任务,并且任务结束和计算任务个数
最后get:获取返回值
什么是异步调用:提交完一个任务过后不会在原地等待,而是继续提交下一个任务。等待所有的任务结束后在用get获取任务
import multiprocessing import time import random import os def walk(n): print('%s is walking'%os.getpid()) time.sleep(random.random()) return n if __name__=='__main__': p=multiprocessing.Pool(4) li=[] for i in range(10): q=p.apply_async(walk,args=(i,)) li.append(q) p.close() p.join() for i in li: print(i.get())
二、回调函数:
什么是回调函数:通过一个函数内存调用的函数,如果将这个函数的地址当作参数传给另一个函数,当这个函数的地址用来调用其所只想的函数是,这个所指向的函数就是回调函数。
callback:后面加上的是回调函数
回调函数的进程其实就是主进程。
用回调函数实现一个网络爬虫;需要用到requests模块
get:获取网址
status_code:返回状态码
text:查看下载网址的内容
详情访问:http://www.cnblogs.com/hainan-zhang/p/6222552.html
from multiprocessing import Pool,Process import requests import os import time,random def get(url): print('%s GET %s' %(os.getpid(),url)) response=requests.get(url) time.sleep(random.randint(1,3)) 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\n' %(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) start_time=time.time() objs=[] for url in urls: obj=p.apply_async(get,args=(url,),callback=parse) #主进程负责干回调函数的活 objs.append(obj) p.close() p.join() print('主',(time.time()-start_time))