python 多程序間交換資訊與共享資訊

2022-03-25 17:16:58 字數 4008 閱讀 8332

多執行緒呼叫函式,獲取其返回值,個人總結了三種方法:

一、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,queue

def 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')

執行結果:

20

16ok

二、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 multiprocessing

def 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 multiprocessing

from 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 8108

i 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, pipe

def 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...