方法一:
from urllib import request
from multiprocessing import Process
import os
#下载器函数
def downloader(url,**kwargs):
print('当前进程id:',os.getpid(),os.getppid())
#os.getpid()获取当前进程id,os.getppid()获取当前进程父进程id
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__':
url_list = [
'https://www.baidu.com/img/baidu_jgylogo3.gif',
'http://www.offcn.com/statics/images/zgimg/index2019.png'
]
name_list = ['进程1--张翠花','进程2---赵铁蛋']
p_list = []#进程列表
i = 0
for url in url_list:
n = name_list[i]
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('~~~~~~~~~~~~~~~~~~~~所有文件下载完成!~~~~~~~~~~~~~~~~~~~~~~~')
方法二
from multiprocessing import Process
import os
from urllib import request
#步骤1:继承Process类
class Process_Class(Process):
# 因为Process类本身也有__init___方法,这个子类相当于重写了这个方法。
# 但这样会带来一个问题,我们并没有完成的初始化一个进程类,所以就不能使用这个类继承的一些方法和属性。
#步骤2:使用父类初始化方法初始子类
def __init__(self,url):
Process.__init__(self)
self.url = url
#步骤3:重写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)
if __name__ == '__main__':
url_list = [
'https://www.baidu.com/img/baidu_jgylogo3.gif',
'http://www.offcn.com/statics/images/zgimg/index2019.png'
]
for url in url_list:
p = Process_Class(url)
p.start()