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

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

猜你喜欢

转载自blog.csdn.net/Liang_Ren_/article/details/88541860