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

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

 

原文地址:https://www.cnblogs.com/ywk-1994/p/9446988.html