zoukankan      html  css  js  c++  java
  • 就业DAY5_多任务_进程,进程池,队列

    import time
    import multiprocessing
    
    def sing():
        """"唱歌 5秒钟"""
        for i in range(5):
            print("----正在唱歌----")
            time.sleep(1)
    
    
    def dance():
        """跳舞 子线程"""
        for i in range(5):
            print("----正在跳舞----")
            time.sleep(1)
    
    def main():
        p1 = multiprocessing.Process(target=sing)
        p2 = multiprocessing.Process(target=dance)
        p1.start()  
        p2.start()
    
    
    if __name__ == "__main__":
        main()

    Queue队列  先进先出

    多进程之间通过Queue来实现数据共享

    import multiprocessing
    
    
    def download_from_web(q):
        # 模拟从网上下载的数据
        data = [11, 22, 33, 44]
        # 向队列中写入数据
        for temp in data:
            q.put(temp)
        print("---下载器已经下载完了数据并且存入队列中")
    
    
    def analysis_data(q):
        """数据说明"""
        waitting_analysis_data  = list()
        # waitting = []
        # 从队列中获取数据
        while True:
            data = q.get()
            waitting_analysis_data.append(data)
            if q.empty():
                break
        print(waitting_analysis_data)
    
    
    def main():
        # 1 创建一个队列
        q = multiprocessing.Queue()
    
        # 2 创建多个进程,将队列的引用作为实参进行传递到里面
        p1 = multiprocessing.Process(target=download_from_web, args=(q,))
        p2 = multiprocessing.Process(target=analysis_data, args=(q,))
        p1.start()
        p2.start()
    
    
    if __name__ == "__main__":
        main()
    from multiprocessing import Pool
    import time
    import os
    import random
    
    def  worker(msg):
        t_start = time.time()
        print("%s开始执行,进程编号为%d" % (msg, os.getpid()))
        # random.random() 随机生成0-1之间的浮点数
        time.sleep(random.random()*2)
        t_stop = time.time()
        print(msg,"执行完毕,耗时%0.2f" % (t_stop- t_start))
    
    # 定义一个进程池 最大进程数3
    po = Pool(3)
    for i in range(0, 9):
        # Pool().apply async (要调用的目标,(传递给目标的参数元组))
        # 每次循环将会用空闲出来的子进程去调用目标
        po.apply_async(worker, args=(i,))
    print("----start----")
    po.close()  # 关闭进程池 关闭后po不再接受新的请求
    po.join()  # 等待po中所有子进程执行完成,必须放在close语句之后
    print("----end----")

    ----start----
    0开始执行,进程编号为19288
    1开始执行,进程编号为19289
    2开始执行,进程编号为19290
    1 执行完毕,耗时0.55
    3开始执行,进程编号为19289
    2 执行完毕,耗时1.35
    4开始执行,进程编号为19290
    3 执行完毕,耗时0.88
    5开始执行,进程编号为19289
    0 执行完毕,耗时1.51
    6开始执行,进程编号为19288
    4 执行完毕,耗时0.55
    7开始执行,进程编号为19290
    5 执行完毕,耗时1.27
    8开始执行,进程编号为19289
    7 执行完毕,耗时0.84
    8 执行完毕,耗时0.23
    6 执行完毕,耗时1.53
    ----end----

    import multiprocessing
    import os
    
    def copy_file(q, file_name, old_folder_name, new_folder_name):
        """完成文件的复制"""
        # print("%s,%s,%s" % (old_folder_name, file_name, new_folder_name))
        old_f = open(old_folder_name + "/" + file_name, "rb")
        content = old_f.read()
        old_f.close()
    
        new_f = open(new_folder_name + "/" + file_name, "wb" )
        new_f.write(content)
        new_f.close()
        # 如果拷贝完了文件,那么就向队列中写入一个消息,表示已经完成
        q.put(file_name)
    
    
    def main():
        # 1 输入文件夹名,获取用户要copy的文件夹的名字
        old_folder_name = input("请输入要拷贝的文件夹的名字")
    
        # 2 创建一个新的文件夹
        try:
            new_folder_name = old_folder_name + "[复件]"
            os.mkdir(new_folder_name)
        except:
            pass
    
        # 3 获取文件夹中所有待copy文件名 listdir()
        file_names = os.listdir(old_folder_name)
        print(file_names)
    
        # 4 创建进程池
        po = multiprocessing.Pool(5)
    
        # 5 创建队列
        q = multiprocessing.Manager().Queue()
    
        # 6 向进程池中添加拷贝文件的任务
        for file_name in file_names:
            po.apply_async(copy_file, args=(q, file_name, old_folder_name, new_folder_name))
    
        po.close()
        # po.join()
        all_file_name = len(file_names)  # 测一下所有文件个数
        copy_ok_num = 0
        while True:
            file_name = q.get()
            # print("已经完成拷贝%s" % file_name)
            copy_ok_num += 1
            print("
    拷贝的进度为:%.2f%%" % (copy_ok_num*100/all_file_name),end="")
            if copy_ok_num >= all_file_name:
                break
    
    
    if __name__ == "__main__":
        main()

    栈 先进后出

  • 相关阅读:
    【生活没有希望】poj1273网络流大水题
    SPOJ FASTFLOW网络流水题
    【生活没有希望】hdu1166敌兵布阵 线段树
    【生活没有希望】NOIP2010初赛 烽火传递 smartoj1475
    【填坑向】bzoj2038小Z的袜子 莫队
    (RMQ版)LCA注意要点
    【填坑向】spoj COT/bzoj2588 Count on a tree
    bzoj4364: [IOI2014]wall砖墙
    【听说是线段树】bzoj1012 [JSOI2008]最大数maxnumber
    bzoj4196 [Noi2015]软件包管理器 树链剖分+线段树
  • 原文地址:https://www.cnblogs.com/joycezhou/p/11469640.html
Copyright © 2011-2022 走看看