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

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

     

  • 相关阅读:
    不使用库函数,编写函数int strcmp(char *source, char *dest) 相等返回0,不等返回-1【转】
    atol实现【转】
    atol的实现【转】
    关于内存中栈和堆的区别(非数据结构中的堆和栈,区别)【转】
    ubuntu下安装android模拟器genymotion【转】
    buntu下命令行安装jdk,android-studio,及genymotion虚拟机来进行android开发【转】
    Ubuntu下安装Android studio【转】
    C++模板(二)【转】
    【转】iOS中设置导航栏标题的字体颜色和大小
    【转】Java 截取字符串
  • 原文地址:https://www.cnblogs.com/ywk-1994/p/9446988.html
Copyright © 2011-2022 走看看