#网络通信模块
from urllib import request
def downloader(url,isPicture=False):
"""
:param url: 网址
:param isPicture:
:return:None ,直接保存为文件,不需要返回值
"""
file_name = url.split("/")[-1]#按“/”切成列表并取出列表中的最后一个
response=request.urlopen(url)
#查看请求响应
content=response.read()
if isPicture==True:
with open(file_name,"wb") as fb:
fb.write(content)
print(content)
else:
content = content.decode("utf-8") # 对请求数据进行解码
with open("index1.html","w",encoding="utf-8") as fb:
fb.write(content)
print(content)
downloader("http://www.langlang2017.com/",isPicture=False)
downloader("http://www.langlang2017.com/img/banner1.png",isPicture=True)
#用进程实现多任务 import time from multiprocessing import Process def sing(): for i in range(3): time.sleep(1) print("唱歌",i) def dance(): for i in range(3): time.sleep(1) print("跳舞",i) # if __name__ == '__main__': # sing() # dance() if __name__ == '__main__': p=Process(target=sing) p.start()#子进程 dance()#主进程
#下载器 from urllib import request from multiprocessing import Process import os def downloader(url,**kwargs): print("当前进程id:",os.getpid(),os.getppid()) print('关键字参数',kwargs['pro']) #文件名 file_name=url.split("/")[-1] #网络请求 response=request.urlopen(url)#一个响应对象 #获取响应内容 content = response.read() #保存 with open(file_name,"wb") as fp: fp.write(content) if __name__ == '__main__': # for i in range(1,5,1): # url='http://www.langlang2017.com/img/banner'+str(i)+'.png' # p=Process(target=downloader,args=(url,)) # p.start() url_list=['http://www.langlang2017.com/img/banner1.png', 'http://www.langlang2017.com/img/banner2.png', 'http://www.langlang2017.com/img/banner3.png', 'http://www.langlang2017.com/img/banner4.png'] name_list=["进程1","进程2","进程3","进程4"] p_list=[] i=0 for url in url_list: n=name_list[i] i+=1 p=Process(target=downloader,name=n,args=(url,),kwargs={"pro":"最高等级"}) print('子进程(%s)将要被运行'%p.name) p.start() p_list.append(p) for p in p_list: p.join() print("主进程ID:",os.getpid()) print("----------所有文件下载完成---------")
#创建进程的方法2: from multiprocessing import Process import os from urllib import request #步骤一:继承Process类 class Process_Class(Process): #因为Process类本身也有init方法,这个子类相当于重写了这个方法 #但这样会带来一个问题,我们并没有完全的初始化一个进程类,所以就不能使用这个类继承的一些方法和属性 #步骤二:使用父类初始化方法初始子类 def __init__(self,url): # super().__init__() Process.__init__(self) self.url=url #步骤三:重写Process类中的run方法 def run(self): print("当前进程id:",os.getpid(),os.getppid()) #文件名 file_name=self.url.split("/")[-1] #网络请求 response=request.urlopen(self.url)#一个响应对象 #获取响应内容 content = response.read() #保存 with open(file_name,"wb") as fp: fp.write(content) # print("----------子进程创建成功---------") if __name__ == '__main__': url_list=['http://www.langlang2017.com/img/banner1.png', 'http://www.langlang2017.com/img/banner2.png', 'http://www.langlang2017.com/img/banner3.png', 'http://www.langlang2017.com/img/banner4.png'] for url in url_list: p=Process_Class(url) p.start()
#进程池 from multiprocessing import Pool import time,random def worker(msg): t_start = time.time() print('%s--开始执行'%(msg)) time.sleep(random.random())#模拟工作所消耗的时间 t_end = time.time() print('%s--执行完毕,消耗时间为:%0.2f'%(msg,t_end-t_start)) if __name__ == '__main__': p = Pool(3)#创建一个容量是3的进程池 for i in range(10): #将进程添加到进程池, # 格式:进程池.apply_async(func=单个进程要调用的目标,args=(参数1,参数2....)) #每次循环将会用空闲的子进程去调用目标 p.apply_async(func=worker,args=(i,))#异步操作(并行操作) # p.apply(func=worker,args=(i,))#同步操作(串行操作) print('-----------start----------') #关闭进程池,关闭后进程池将不再接收新的任务 p.close() #等待进程池中的所有子进程都结束后,注意:join一定要放在close后面。 p.join() print('------------end----------')