• 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个子进程也是有主进程创建

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

     

  • 相关阅读:
    安装yum源和gcc编译器遇到的问题
    (转)Linux下C++开发初探
    (转)求模和求余
    scanf———while(scanf ("%lu",&num) = =1)什么意思
    【Eclipse】 Alt+/ 代码提示问题解决方案
    【正则表达式】常用正则表达式
    【JAVA】Quartz中时间表达式的设置
    【Oracle】如何导库
    【JAVA】JMX简单使用方法
    【JAVA】Math.Round()函数常见问题“四舍5入”
  • 原文地址:https://www.cnblogs.com/ywk-1994/p/9446988.html
Copyright © 2020-2023  润新知