1. 程式人生 > >Python多程序之程序池

Python多程序之程序池

由於Python中執行緒封鎖機制,導致Python中的多執行緒並不是正真意義上的多執行緒。當我們有並行處理需求的時候,可以採用多程序迂迴地解決。

如果要在主程序中啟動大量的子程序,可以用程序池的方式批量建立子程序。
首先,建立一個程序池子,然後使用apply_async()方法將子程序加入到程序池中。

import multiprocessing
import os
import time
from datetime import datetime


def subprocess(number):
    # 子程序
    print('這是第%d個子程序' % number)
    pid = os.getpid()  # 得到當前程序號
print('當前程序號:%s,開始時間:%s' % (pid, datetime.now().isoformat())) time.sleep(30) # 當前程序休眠30秒 print('當前程序號:%s,結束時間:%s' % (pid, datetime.now().isoformat())) def mainprocess(): # 主程序 print('這是主程序,程序編號:%d' % os.getpid()) t_start = datetime.now() pool = multiprocessing.Pool() for
i in range(8): pool.apply_async(subprocess, args=(i,)) pool.close() pool.join() t_end = datetime.now() print('主程序用時:%d毫秒' % (t_end - t_start).microseconds) if __name__ == '__main__': # 主測試函式 mainprocess()

Pool物件呼叫join()方法會等待所有子程序執行完畢,呼叫join()之前必須先呼叫close(),呼叫close()

之後就不能繼續新增新的Process了。
可能的執行結果:

這是主程序,程序編號:10264
這是第0個子程序
當前程序號:10688,開始時間:2017-04-05T11:23:47.039989
這是第1個子程序
當前程序號:10152,開始時間:2017-04-05T11:23:47.055615
這是第2個子程序
當前程序號:5764,開始時間:2017-04-05T11:23:47.055615
這是第3個子程序
當前程序號:6392,開始時間:2017-04-05T11:23:47.055615
這是第4個子程序
當前程序號:9744,開始時間:2017-04-05T11:23:47.055615
這是第5個子程序
當前程序號:2636,開始時間:2017-04-05T11:23:47.071240
這是第6個子程序
當前程序號:6788,開始時間:2017-04-05T11:23:47.071240
這是第7個子程序
當前程序號:1604,開始時間:2017-04-05T11:23:47.071240
當前程序號:10688,結束時間:2017-04-05T11:24:17.053047
當前程序號:10152,結束時間:2017-04-05T11:24:17.062183
當前程序號:5764,結束時間:2017-04-05T11:24:17.062183
當前程序號:9744,結束時間:2017-04-05T11:24:17.062183
當前程序號:6392,結束時間:2017-04-05T11:24:17.062183
當前程序號:2636,結束時間:2017-04-05T11:24:17.072177
當前程序號:6788,結束時間:2017-04-05T11:24:17.072177
當前程序號:1604,結束時間:2017-04-05T11:24:17.072177
主程序用時:255168毫秒

官方API文件說明:

close()
Prevents any more tasks from being submitted to the pool. Once all the tasks have been completed the worker processes will exit.

join()
Wait for the worker processes to exit. One must call close() or terminate() before using join().