您的位置:首页 > 编程语言 > Python开发

Python-网络通信/进程/下载器/进程池等

2019-03-13 21:23 218 查看

urlib:

1,网络通信:

from urllib import request#网络通信模块
#相对路径:01.网络通信.py
#绝对路径:E:\0312\01.网络通信.py

def downloader(url,isPicture=False):
'''
:param url: 网址
:param isPicture: 默认是False值,表示是文本,如果下载的是图片,此值将赋值为True
:return: none---直接保存成文件,不需要返回值
'''
#路径最后为文件名
file_name = url.split('/')[-1]

#请求得到响应
response = request.urlopen(url)

#查看响应内容
content = response.read()

#图片和文本区别保存
if isPicture:
with open(file_name,'wb') as fp:
fp.write(content)
else:
content = content.decode('utf-8')
with open(file_name,'w',encoding='utf-8') as fp:
fp.write(content)

downloader('https://www.baidu.com/img/bd_logo1.png',isPicture=True)

http:

操作系统:

进程:
,2,编程实现唱歌跳舞这件事

import time

def sing():
for i in range(3):
time.sleep(1)
print('唱第%d首歌儿'%i)

def dance():
for i in range(3):
time.sleep(1)
print('跳第%d段舞蹈'%i)

import os
if __name__ == '__main__':
sing()
dance()
print(os.getpid())
#小结,现在是唱完歌再跳舞,是一个串行操作
#想边唱歌边跳舞,并行操作,操作效率。

# 多任务:操作系统可以运行多个任务。
#单个CPU在任何时候只能执行一个任务。
# 因为CPU运算速度实在是太快了

3,使用进程实现多任务:

import time
#进程实现多任务的步骤:
# 1.导入模块:
from multiprocessing import Process

def sing():
for i in range(3):
time.sleep(1)
print('唱第%d首歌儿'%i)

def dance():
for i in range(3):
time.sleep(1)
print('跳第%d段舞蹈'%i)

if __name__ == '__main__':

#2.创建进程
p = Process(target=sing)

#3.启动
p.start()

dance()

4,下载器:

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'
#     print(url)
#     p = Process(target=downloader,args=(url,))
#     p.start()

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('~~~~~~~~~~~~~~~~~~~~所有文件下载完成!~~~~~~~~~~~~~~~~~~~~~~~')

5,创建进程的方法二:

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()

6,进程池:

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----------')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: