1. 程式人生 > >使用multiprocessing簡單封裝一個多程序方法,方便呼叫

使用multiprocessing簡單封裝一個多程序方法,方便呼叫

首先,眾所周知多執行緒在python中可能不像其他語言中那麼有效,所以,用的比較多的還是多程序的方法,而multiprocessing庫則給我們提供了很方便的多程序管理方法。

話不多說,程式碼量不大,也不也不難理解,直接上程式碼

from multiprocessing import Pool,Queue
import time
class MultiProcessingUtils:
    def __init__(self,processCount,function,taskList):
        # 程序數,建議取cpu_count
        self.processCount=processCount
        #執行的方法
        self.function=function
        #待執行的任務列表
        self.taskList=taskList
    def run(self):
        count=self.processCount
        q = Queue()
        p = Pool(count)
        for item in self.taskList:
            q.put(item)
        time1 = time.time()
        while q.qsize() > 0:
            for i in range(count):
                p.apply_async(self.function, args=(q.get(),))
        p.close()
        p.join()
        time2 = time.time()
        print('---------------耗時:{}--------------'.format(time2 - time1))

大體思想就是,使用程序池建立幾個程序,再迴圈佇列中的值,給方法進行呼叫,簡單的上一段測試程式碼吧!

def fun(item):
    print('-----------------------------:{}'.format(item))
    time.sleep(random.random())

if __name__ == '__main__':
    list=[]
    for i in range(1000):
        list.append(i)
    m=MultiProcessingUtils(10,fun,list)
    m.run()

這裡使用的是十個程序,建議還是以電腦的核心數為準,減少資源排程出錯的可能性。

最後打印出結果:

-----------------------------:993
-----------------------------:994
-----------------------------:995
-----------------------------:996
-----------------------------:997
-----------------------------:998
-----------------------------:999
---------------耗時:50.96454930305481--------------

Process finished with exit code 0

耗時51秒左右,可以看出,測試案例只是個很簡單的方法,就是列印數字後隨機sleep一秒內。如果在單程序中,可以計算出預期耗時應為500秒,而在此處十個程序的情況下僅用時51秒,可以看出多程序確實能夠減少不少的工具時間,當我們再爬取網站時,合理的分配任務,以及程序排程能夠減少爬取的時間,當然,要做一隻友好的爬蟲。