zoukankan      html  css  js  c++  java
  • python基础:多进程讲解

    fork的使用方法:

    import os 
    import time
    
    # 主进程执行到os.fork()会产生一个子进程。ret>0,代表主进程;ret=0,代表子进程
    ret=os.fork() # 从这句开始,父进程和子进程都会执行以下的代码
    print(ret)
    if ret>0:
        print('---父进程--{}-'.format(os.getpid))
        time.sleep(1)
    else:
        print('---子进程-{}-{}-'.format(os.getpid,os.getppid()))
        time.sleep(1)

    note:fork只能在linux平台下使用,其他平台没有该方法。

      全局变量在多个进程中不共享:

    g_num=100
    
    ret=os.fork()
    if ret==0:
        g_num+=1
        print('process-1 g_num={}'.format(g.num)) # 输出 101
    else:
        time.sleep(3)
        print('process-2 g_num={}'.format(g.num)) # 输出 100

     multiprocessing模块的使用(具有跨平台特性)

    方法一:创建一个Process对象

    from multiprocessing import Process
    import time
    
    def test():
        while True:
            print('test')
            time.sleep(1)
    
    if __name__=='__main__':
    
        p=Process(target=test)
        p.start() # 开启一个进程
        p.join() # 等待该进程运行结束

    方法二:创建一个类继承Process类,并重写run方法

    from multiprocessing import Process
    import time
    
    class MyProcess(Process):
    
        def run(self):
            while True:
                print('my process')
                time.sleep(1)
                
    if __name__=='__main__':
        p=MyProcess()
        p.start()
        
        while True:
            print('main')
            time.sleep(1)

    使用进程池Pool

    # -*- coding:utf-8 -*-
    from multiprocessing import Pool
    import os
    import random
    import time
    
    def worker(num):
        for i in range(5):
            print('pid={} num={}'.format(os.getpid(),num))
            time.sleep(1)
            
    if __name__=='__main__':
        pool=Pool(3)
        for i in range(10):
            print('---{}---'.format(i))
            pool.apply_async(worker,(i,))
            
        
        pool.close() # 
        pool.join() # 等待pool中所有子进程结束

     进程间通信Queue,多进程拷贝文件。

    # -*- coding:utf-8 -*-
    from multiprocessing import Pool,Manager
    import os
    import random
    import time
    
    def copyFileTask(filename,oldFolderName,newFolderName,queue):
        
        with open(os.path.join(oldFolderName,filename),'r') as fr:
        
            print(os.path.join(oldFolderName,filename))
            content=fr.read()
            
            with open(os.path.join(newFolderName,filename),'w') as fw:
            
                print(os.path.join(newFolderName,filename))
                fw.write(content)
        
        queue.put(filename)
        
            
    def main():
        # 0. 获取用户要copy的文件夹的名字
        oldFolderName=input("请输入文件夹的名字:")
    
        # 1. 创建一个文件夹
        newFolderName=oldFolderName+"-副本"
        os.mkdir(newFolderName)
    
        # 2. 获取old文件夹中的所有的文件名字
        filenames=os.listdir(oldFolderName)
    
        # 3. 使用多进程的方式copy所有文件
        pool=Pool(5)
        q=Manager().Queue()
        
        for filename in filenames:
            pool.apply_async(copyFileTask,args=(filename,oldFolderName,newFolderName,q))
        
        pool.close()
        pool.join()
        
        num=0
        allNum=q.qsize()
        while not q.empty():
            q.get()
            num+=1
            copyRate=num/allNum
            print('
    copy的进度是:{:.2f}%'.format(copyRate*100))
            
    if __name__=='__main__':
        main()
  • 相关阅读:
    五子棋算法
    记录2个算法知识(常见面试题)
    python基础面试题之类型转换(字典篇)
    Python中的多线程和多进程的应用场景和优缺点。
    python基础面试题之输入年月日,判断这个日期是这一年的第几天。
    Python装饰器(面试题)
    linux终止进程
    nest_asyncio出现错误
    sanic 相关的插件
    linux如何配置nginx全局变量
  • 原文地址:https://www.cnblogs.com/hypnus-ly/p/8129205.html
Copyright © 2011-2022 走看看