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

    栈 先进后出

  • 相关阅读:
    hdu 1017 A Mathematical Curiosity 解题报告
    hdu 2069 Coin Change 解题报告
    hut 1574 组合问题 解题报告
    hdu 2111 Saving HDU 解题报
    hut 1054 Jesse's Code 解题报告
    hdu1131 Count the Trees解题报告
    hdu 2159 FATE 解题报告
    hdu 1879 继续畅通工程 解题报告
    oracle的系统和对象权限
    oracle 自定义函数 返回一个表类型
  • 原文地址:https://www.cnblogs.com/joycezhou/p/11469640.html
Copyright © 2011-2022 走看看