1. 程式人生 > >python中multiprocessing模塊

python中multiprocessing模塊

window 方法 __name__ 文章 第一個 pan return bsp RoCE

multiprocess模塊那來幹嘛的?

答:利用multiprocessing可以在主進程中創建子進程。

#該模塊和Threading模塊使用方法基本類似。

  • 首先需要說明,你所使用多線程的函數不能有return,比如你要將job這個函數多線程那麽在job這個函數裏就不能有return,如果有返回值請看文章的最後。
  • multiprocessing最好寫在if __name__ == ‘__main__‘當中,如果不放在這裏面,windows可能會出錯。其余環境則不會出現這種情況。我第一個案例沒有加,第二個案例加了。

案例:

 1 #!usr/bin/env python
 2 #encding:utf-8
3 #by i3ekr 4 5 import multiprocessing,time 6 7 def job(q,a):#將Queue當參數傳入,且必須放在首位。 8 time.sleep(3) 9 print this is test...%s%(a) 10 11 12 start = time.time() 13 q = multiprocessing.Queue()#定義一個Queue,這個Queue是必須的。 14 p1 = multiprocessing.Process(target=job,args=(q,1))#創建一個線程,第一個q是Queue,第二個是參數的value。如果沒有參數的話必須要(q,)逗號是必須要加的
15 p2 = multiprocessing.Process(target=job,args=(q,2)) 16 p1.start() 17 p2.start() 18 p1.join() 19 p2.join() 20 end = time.time() 21 print("run time is %s"%(end-start))

輸出結果:

root@i3ekr:/home/i3ekr/Desktop# python 1.py
this is test...1
this is test...2
run time is 3.0163371563


那麽函數有返回值的時候怎麽做?

使用隊列.put()進行保存值。使用get得到返回值。如下案例所示:

需要註意得是:

  • 有多少個返回值就要有多少個get。並不是一下子把所有得返回值全都一起輸出之類得。如下代碼20-21行,因為有兩個線程,所以執行了兩遍job函數,所以也有兩個返回值。故也必須要有兩個get去得到value
 1 #!usr/bin/env python
 2 #encding:utf-8
 3 #by i3ekr
 4 
 5 import multiprocessing,time
 6 
 7 def job(q,a):
 8     time.sleep(3)
 9     q.put(a)#得到a
10 
11 
12 if __name__ == __main__:
13     start = time.time()
14     q = multiprocessing.Queue()
15     p1 = multiprocessing.Process(target=job,args=(q,1))
16     p2 = multiprocessing.Process(target=job,args=(q,2))
17     p1.start()
18     p2.start()
19     p1.join()
20     p2.join()
21     res1 = q.get()#得到job得返回值
22     res2 = q.get()
23     print res1,res2
24     end = time.time()
25     print("run time is %s"%(end-start))

輸出結果:

root@i3ekr:/home/i3ekr/Desktop# python 1.py
1 2
run time is 3.01186394691

python中multiprocessing模塊