day23:操作系统:进程

#网络通信模块
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----------')

猜你喜欢

转载自blog.csdn.net/weixin_43800846/article/details/88428451
今日推荐