一、介绍多进程是指在同一程序中创建多个独立的进程来执行任务。每个进程都有自己独立的内存空间相互之间不干扰。因为GIL锁的存在对于CPU密集型任务例如计算密集型操作使用多进程可以提高程序的效率。优点1.可以利用多核CPU提高计算效率。2.每个进程独立运行安全性高。二、使用Python提供了multiprocessing模块来实现多进程。注意1.multiprocessing.Process 用于创建进程。target参数指定了进程要执行的函数args参数传递给该函数的参数。2.使用 start方法启动进程。3.join方法使主进程等待子进程完成。importmultiprocessingimporttimedefworker(name):print(fWorker{name}starting)time.sleep(2)print(fWorker{name}finished)if__name____main__:processes[]foriinrange(5):pmultiprocessing.Process(targetworker,args(i,))processes.append(p)p.start()forpinprocesses:p.join()print(A11 workers finished)Worker0starting Worker1starting Worker2starting Worker3starting Worker4starting Worker0finished Worker1finished Worker2finished Worker3finished worker4finished All workers finished三、进程池进程池是一种预先创建的一组工作进程这些进程可以重复使用来执行多个任务。通过进程池可以避免频繁创建和销毁进程的开销从而提高效率。4.1 进程池的使用Python的 multiprocessing 模块提供了Pool类来实现进程池。frommultiprocessingimportPoolimporttimedefworker(num):print(fWorker{num}starting)time.sleep(2)print(fWorker{num}finished)returnnum*numif__name__main:withPool(processes4)aspool:resultspool.map(worker,range(10))print(Results:,results)1.创建进程池使用 Poolprocesses4创建一个包含4个进程的进程池。2.提交任务pool.mapworkerrange10将 worker函数应用到 range10中的每一个元素并将任务分配给进程池中的进程去执行。3.获取结果map方法会阻塞主进程直到所有任务完成并返回结果列表。Worker0starting Worker1starting Worker0finished Worker1finished Worker2starting Worker3starting Worker2finished Worker4starting Worker3finished Worker4finished Results:[0,1,4,9,16]4.2 常用方法apply和apply_async:applyfuncargs同步执行类似于普通函数调用阻塞主进程直到任务完成。apply_asyncfuncargs异步执行不阻塞主进程通过回调函数获取结果。frommultiprocessingimportPooldefworker(num):returnnum*numdefprintresult(result):print(Result:,result)if__name__main:withPoolprocesses4aspool:#同步等待结果resultpool.apply(worker,(10,))print(Synchronous Result:,result)#异步等待结果pool.apply_async(worker,(20,),callbackprint_result)pool.close()pool.join()map和 map_async使用该方法传参数时将iterable的每个元素作为参数相当于一次提交多个任务。mapfunciterable同步映射阻塞主进程直到所有任务完成返回结果列表。map_asyncfunciterable异步映射不阻塞主进程通过回调函数获取结果。frommultiprocessingimportPooldefworker(num):returnnum*numdefprintresult(results):print(Results:,results)if__name__main:withPool(processes4)aspool:#同步resultspool.map(worker,range(10))print(Synchronous Results:,results)# 异步pool.mapasync(worker,range(10),callbackprint_result)pool.close()pool.join()starmap 和 starmap_async :starmap(func, iterable_of_tuples):类似于map但可以传递多个参数。starmap_async(func, iterable_of_tuples): 异步版本的 starmapfrommultiprocessingimportPooldefworker(x,y):returnx*ydefprint_result(results):print(Results:,results)if__name__main:withPool(processes4)aspool:#同步resultspool.starmap(worker,[(1,2),(3,4),(5,6)])print(Synchronous Results:,results)#异步pool.starmap_async(worker,[(1,2),(3,4),(5,6)],callbackprint_result)pool.close()pool.join()先试用pool.close()关闭进程池防止更多的任务提交到该池才可以执行pool.join()阻塞主进程等待所有子进程完成。
