python進程間通信


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()

  • 運行結果;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM