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个子进程也是有主进程创建
如果你和我有共同爱好,我们可以加个好友一起交流!