標籤:nbsp desktop lan 多核 檔案 版本 dmi style alt
python 多線程:多線程
由於Python設計的限制(我說的是咱們常用的CPython)。最多隻能用滿1個CPU核心。
Python提供了非常好用的多進程包multiprocessing,你只需要定義一個函數,Python會替你完成其他所有事情。藉助這個包,可以輕鬆完成從單進程到並發執行的轉換。
1、建立單一進程
如果我們建立少量進程,可以如下:
import multiprocessingimport timedef func(msg): for i in xrange(3): print msg time.sleep(1)if __name__ == "__main__": p = multiprocessing.Process(target=func, args=("hello", )) p.start() p.join() print "Sub-process done."
2、使用進程池
是的,你沒有看錯,不是線程池。它可以讓你跑滿多核CPU,而且使用方法非常簡單。
注意要用apply_async,如果落下async,就變成阻塞版本了。
processes=10是最多並發進程數量。代碼如下,能同時看到10個檔案在同時進行寫入。
# /usr/bin/env python# coding=utf8import multiprocessingimport timepath = "C:\\Users\\admin.95BNQ4GMHNOZBFR\\Desktop\\linshi\\test\\"num = 0def func(msg,k): print msg # for i in xrange(3): for j in range(5000): ff = open(path + str(k) + ".txt","a") ff.write("mmmmm" + "\n") ff.close() # time.sleep()if __name__ == "__main__": pool = multiprocessing.Pool(processes=10) #同時跑十個進程 for i in xrange(100): #先把這100個跑完,然後每次跑其中的十個 msg = "hello %d" % (i) print msg + "---" pool.apply_async(func, (msg,i)) pool.close() pool.join() print "Sub-process done."
運行結果:可以看出把100個任務送進進程池中,然後每次從中取10個
3、使用Pool,並需要關注結果
更多的時候,我們不僅需要多進程執行,還需要關注每個進程的執行結果,如下:
# /usr/bin/env python# coding=utf8import multiprocessingimport timepath = "C:\\Users\\admin.95BNQ4GMHNOZBFR\\Desktop\\linshi\\test\\"num = 0def func(msg, k): print "||" + msg # for i in xrange(3): for j in range(3000): ff = open(path + str(k) + ".txt", "a") ff.write("mmmmm" + "\n") ff.close() return "the " + str(k) + " have done" # 返回已經完成的狀態if __name__ == "__main__": pool = multiprocessing.Pool(processes=4) # 同時跑十個進程 result = [] for i in xrange(10): # 先把這100個跑完,然後每次跑其中的十個 msg = "hello %d" % (i) print msg + "---" result.append( pool.apply_async(func, (msg, i))) pool.close() pool.join() for res in result: #進程池中的任務結束後,輸出完成的狀態 print res.get() print "Sub-process done."
python(32):多進程 multiprocessing