python 多線程:多線程html
因爲Python設計的限制(我說的是我們經常使用的CPython)。最多隻能用滿1個CPU核心。
Python提供了很是好用的多進程包multiprocessing,你只須要定義一個函數,Python會替你完成其餘全部事情。藉助這個包,能夠輕鬆完成從單進程到併發執行的轉換。python
一、新建單一進程多線程
若是咱們新建少許進程,能夠以下:併發
import multiprocessing import time def 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."
二、使用進程池app
是的,你沒有看錯,不是線程池。它可讓你跑滿多核CPU,並且使用方法很是簡單。async
注意要用apply_async,若是落下async,就變成阻塞版本了。函數
processes=10是最多併發進程數量。代碼以下,能同時看到10個文件在同時進行寫入。spa
# /usr/bin/env python # coding=utf8 import multiprocessing import time path = "C:\\Users\\admin.95BNQ4GMHNOZBFR\\Desktop\\linshi\\test\\" num = 0 def 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個線程
三、使用Pool,並須要關注結果設計
更多的時候,咱們不只須要多進程執行,還須要關注每一個進程的執行結果,以下:
# /usr/bin/env python # coding=utf8 import multiprocessing import time path = "C:\\Users\\admin.95BNQ4GMHNOZBFR\\Desktop\\linshi\\test\\" num = 0 def 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."