zoukankan      html  css  js  c++  java
  • python编程系列---进程池的优越性体验

    1.通过multiprocessing.Process()类创建子进程

     1 import multiprocessing, time, os, random
     2 
     3 
     4 def work(index):
     5     """
     6     任务
     7     :param index:任务索引号
     8     """
     9     start_time = time.time()  # 取当前时间,以毫秒为单位,从1979年一月一号算起
    10     # random.random()   :random() -> x in the interval [0, 1)
    11     time.sleep(random.random())
    12     stop_time = time.time()
    13     print("任务%d   执行时间%.2f  当前进程id = %d   当前进程的父进程为id= %d" % (index, stop_time - start_time, os.getpid(), os.getppid()))
    14 
    15 
    16 if __name__ == '__main__':
    17     print("main - 当前进程id = %d" % os.getpid())
    18     # 创建子进程方式1 通过multiprocessing.Process()类创建
    19     for i in range(10):
    20         p = multiprocessing.Process(target=work, args=(i,))
    21         p.start()

    结果如下: 可以看出完成10个任务创建了10个子进程,且这些子进程由主进程创建

    2.使用进程池创建子进程

    """
    进程池
    1. multiprocessing.Pool()
    2. apply_async(func[,args[,kwds]])
      申请异步执行任务
      - func:指向子进程要执行的函数
      - args:向func指向的函数传递可变参数
      - kwargs:向func指向的函数传递关键字参数
    3. close() : 关闭进程池, 不再接收新的任务请求
    4. terminate() :终止进程池中的子进程的任务执行
    5. join(): 阻塞主进程,直到进程池中的所有子进程执行完毕,再解阻塞,必须在close或terminate之后使用;
    """
    import multiprocessing, time, os, random
    
    
    def work(index):
        """
        任务
        :param index:任务索引号
        """
        start_time = time.time()  # 取当前时间,以毫秒为单位,从1979年一月一号算起
        # random.random()   :random() -> x in the interval [0, 1)
        time.sleep(random.random())
        stop_time = time.time()
        print("任务%d   执行时间%.2f  当前进程id = %d   当前进程的父进程为id= %d" % (index, stop_time - start_time, os.getpid(), os.getppid()))
    
    
    if __name__ == '__main__':
        print("main - 当前进程id = %d" % os.getpid())
        # 创建进程池
        """通过进程池来创建子进程,再执行任务
            processes=3: 设置进程池最大值(拥有进程最大数量)
            缺省值: os.cpu_count() or 1  , 即cpu的数量作为进程池的最大值
            """
        pool = multiprocessing.Pool(3)
        for i in range(10):
            pool.apply_async(func=work, args=(i,))

     

    结果如下: 可以看出,完成10个任务,总共还是3个子进程,且这3个子进程也是有主进程创建

    如果你和我有共同爱好,我们可以加个好友一起交流!

     

  • 相关阅读:
    ORACLE DBA的职责
    oracle开发常用LOV
    Oracle Patch 版本的查询
    指定二次分配为主要分配
    系统日期格式引起的错误:出生日期不能为将来日期
    分享一个帮助你检测网站颜色对比度的在线web工具 checkmycolours
    最常用的CURL命令大全
    超棒的javascript移动触摸设备开发类库 QUOjs
    分享一个超炫HTML5开发的jQuery进度条插件 percentageloader
    纯CSS实现的3D简洁按钮设计
  • 原文地址:https://www.cnblogs.com/ywk-1994/p/9446988.html
Copyright © 2011-2022 走看看