多執行緒呼叫函式,獲取其返回值,個人總結了三種方法:
一、queue(程序佇列)
構造方法:multiprocessing.
queue
([maxsize
])queue.queue類即是乙個佇列的同步實現。佇列長度可為無限或者有限。可通過queue的建構函式的可選引數maxsize來設定佇列長度。如果maxsize小於1就表示佇列長度無限。
常用方法:
q.size() 返回佇列中資訊大概數量,有時候可能不太準確。
empty() 檢測佇列是否為空,空返回true,否則返回false。
full() 檢測佇列是否存滿,滿返回ture,否則返回false。
put(obj[, block[, timeout]]) put()有兩個引數,第乙個item為必需的,為插入專案的值;第二個block為可選引數,預設為true。如果佇列當前為空且block為false,put()方法就使呼叫執行緒暫停,直到空出乙個資料單元。如果block為flase,put方法將引發full異常。
put_nowait() 等同於put(obj,false)
get([block[, timeout]]) 移除並返回佇列中乙個資訊。
block為true(default)、timeout為none(default),有資訊立刻返回,否則程序將進入擁塞狀態,直到獲取到乙個資訊。
block為true(default)、設定timeout時間,有資訊立刻返回,否則程序將進入擁塞狀態,timeout時間過後,無資訊產生queue.empty異常。
block為false,有資訊立刻返回,無資訊立刻產生queue.empty異常。
7. get_nowait() 等同於get(false)
python queue模組有三種佇列及建構函式:
佇列可儲存多個資料,資料按照訪問順序依次獲取。如果佇列已為空,再次使用get()函式,主程序將進入等待狀態。
from multiprocessing import process,queuedef multiply(a,b,que): #add a argument to function for assigning a queue
que.put(a * b) #putting return value into queue
que.put(a * (b - 1)) #putting return value into queue
if __name__ == '__main__':
queue1 = queue() #create a queue object
p = process(target = multiply,args = (4,5,queue1)) #setting 3rd argument to queue1
p.start()
p.join()
print(queue1.get()) #getting return value: 20
print(queue1.get()) #getting return value: 16
print('ok')
執行結果:
2016ok
二、manager物件
python中程序間共享資料,處理基本的queue,pipe和value+array外,還提供了更高層次的封裝。使用multiprocessing.manager可以簡單地使用這些高階介面。
manager()返回的manager物件控制了乙個server程序,此程序包含的python物件可以被其他的程序通過proxies來訪問。從而達到多程序間資料通訊且安全。
manager支援的型別有list,dict,namespace,lock,rlock,semaphore,boundedsemaphore,condition,event,queue,value和array。
import multiprocessingdef worker(procnum, return_dict):
'''worker function'''
print str(procnum) + ' represent!'
return_dict[procnum] = procnum
if __name__ == '__main__':
manager = multiprocessing.manager()
return_dict = manager.dict()
jobs =
for i in range(5):
p = multiprocessing.process(target=worker, args=(i,return_dict))
p.start()
for proc in jobs:
proc.join()
print return_dict.values()
執行結果:
0 represent!1 represent!
2 represent!
3 represent!
4 represent!
[0, 1, 2, 3, 4]
三、map
import multiprocessingfrom os import getpid
def worker(procnum):
print 'i am number %d in process %d' % (procnum, getpid())
return getpid()
if __name__ == '__main__':
pool = multiprocessing.pool(processes = 3)
print pool.map(worker, range(5))
執行結果:
i am number 0 in process 8108i am number 1 in process 8108
i am number 2 in process 8108
i am number 3 in process 8108
i am number 4 in process 8108
[8108, 8108, 8108, 8108, 8108]
四、pipes(通道)
構造方法:multiprocessing.
pipe
([duplex
])duplex預設情況下為true,表示通道是雙向的;為false,表示通道是單向的。
返回值:(conn1, conn2)
返回一對連線物件,代表乙個通道的兩端。conn1只能用於接收資訊,conn2只能用於傳送資訊。
from multiprocessing import process, pipedef f(conn):
conn.send([42, none, 'hello'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = pipe()
p = process(target=f, args=(child_conn,))
p.start()
print parent_conn.recv() # prints "[42, none, 'hello']"
p.join()
執行結果:
[42, none, 'hello']
pipe成對出現,乙個傳送資訊,乙個接受資訊。
注意:兩個以上程序或者執行緒同一時間讀、寫資訊,將破壞管道中的資訊。
Python多程序 程序間通訊
1.使用multiprocessing模組建立的程序之間的通訊 coding utf 8 queue類常用屬性和方法 init self,maxsize 1 qsize full empty put obj,block true,timeout none put nowait obj get blo...
python多程序實現程序間通訊
python中的多執行緒其實並不是真正的多執行緒,如果想要充分地使用多核cpu的資源,在python中大部分情況需要使用多程序。python提供了非常好用的多程序包multiprocessing,只需要定義乙個函式,python會完成其他所有事情。借助這個包,可以輕鬆完成從單程序到併發執行的轉換。m...
python多程序 python多程序
當有多個非相關任務需要處理時,並行能大大提高處理速度。這裡簡要介紹python的multiprocessing模組。簡單多程序編寫 當我們任務數量確定而且比較少的時候,可以手動為每個任務指定乙個程序來執行。import multiprocessing as mp def f a print a if...