1 python提供了多種進程通信的方式,主要Queue和Pipe這兩種方式,Queue用於多個進程間實現通信,Pipe是兩個進程的通信
1.1 Queue有兩個方法:
-
Put方法:以插入數據到隊列中,他還有兩個可選參數:blocked和timeout。詳情自行百度
-
Get方法:從隊列讀取並且刪除一個元素。同樣,他還有兩個可選參數:blocked和timeout。詳情自行百度
#!coding:utf-8
from multiprocessing import Process, Queue
import os,time,random
#寫數據進程執行的代碼
def proc_write(q,urls):
print 'Process is write....'
for url in urls:
q.put(url)
print 'put %s to queue... ' %url
time.sleep(random.random())
#讀數據進程的代碼
def proc_read(q):
print('Process is reading...')
while True:
url = q.get(True)
print('Get %s from queue' %url)
if __name__ == '__main__':
#父進程創建Queue,並傳給各個子進程
q = Queue()
proc_write1 = Process(target=proc_write,args=(q,['url_1','url_2','url_3']))
proc_write2 = Process(target=proc_write,args=(q,['url_4','url_5','url_6']))
proc_reader = Process(target=proc_read,args=(q,))
#啟動子進程,寫入
proc_write1.start()
proc_write2.start()
proc_reader.start()
#等待proc_write1結束
proc_write1.join()
proc_write2.join()
#proc_raader進程是死循環,強制結束
proc_reader.terminate()
- 運行截圖:
1.2 Pipe通信機制,
* Pipe常用於兩個進程,兩個進程分別位於管道的兩端
* Pipe方法返回(conn1,conn2)代表一個管道的兩個端,Pipe方法有duplex參數,默認為True,即全雙工模式,若為FALSE,conn1只負責接收信息,conn2負責發送,
* send和recv方法分別為發送和接收信息。
#!coding:utf-8
import multiprocessing
import os,time,random
#寫數據進程執行的代碼
def proc_send(pipe,urls):
#print 'Process is write....'
for url in urls:
print 'Process is send :%s' %url
pipe.send(url)
time.sleep(random.random())
#讀數據進程的代碼
def proc_recv(pipe):
while True:
print('Process rev:%s' %pipe.recv())
time.sleep(random.random())
if __name__ == '__main__':
#父進程創建pipe,並傳給各個子進程
pipe = multiprocessing.Pipe()
p1 = multiprocessing.Process(target=proc_send,args=(pipe[0],['url_'+str(i) for i in range(10) ]))
p2 = multiprocessing.Process(target=proc_recv,args=(pipe[1],))
#啟動子進程,寫入
p1.start()
p2.start()
p1.join()
p2.terminate()
- 運行結果;