python(32):多進程(2) multiprocessing

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."
相關文章
相關標籤/搜索