一 pool
multiprocessing.pool也就是傳說中的進程池,pool的構造如下
multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]]) 中,
processes表示pool中進程的數目,預設地為當前CPU的核心數。
initializer表示新進程的初始化函數。
initargs表示新進程的初始化函數的參數。
maxtasksperchild表示每個進程執行task的最大數目。
apply()用來為pool中的進程賦予task。
map()用來迴圈地為pool中的進程賦予tasks。
close()用來阻止新的task的提交到pool中,一但已有的tasks都完成後,pool將退出。
terminate()用來立即停止pool中所有的進程。
join()等待pool中所有的進程退出。
執行個體:
import multiprocessing
import time
def do_calculation(data):
print(multiprocessing.current_process().name)
time.sleep(3)
return data * 2
def start_process():
print ('Starting', multiprocessing.current_process().name)
if __name__ == '__main__':
inputs = list(range(10))
print ('Input :' + str(inputs))
pool_size = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=pool_size,
initializer=start_process,
)
pool_outputs = pool.map(do_calculation, inputs)
pool.close() # no more tasks
pool.join() # wrap up current tasks
print ('Pool :' + str(pool_outputs))
運行結果:
上面的執行個體中可以看到當前的CPU是8core的,pool中公有8個進程,但是有10個任務,其中有2個進程處理了2個任務。
二 logging
使用multiprocessing啟動的logger來協助調試多進程。例如:
logger = multiprocessing.log_to_stderr(logging.DEBUG)
logger.debug("Test")
完!