python多進程中的隊列數據共享問題

0x00 起python

今天在寫一個小東西的時候,須要控制併發量,但又不能直接調用python multiprocessing(問題會在文後提到)。因而嘗試用Queue來實現。web

 

最一開始的思路是這樣的:併發

from multiprocessing import Process
from Queue import Queue


q = Queue(maxsize = 10)

# 經過web應用往隊列中添加數據
def put(num):
    q.put(num)

def read():
    while True:
        print q.get()


if __name__ == '__main__':
    Process(target=read, args=())

隊列的數據,是從web應用中添加過來的(上面省略了bottle的代碼),開了一個進程,不斷從queue中讀取數據,並進行處理(省略了處理過程)。socket

邏輯是沒錯的,可是在實際測試的時候,發現一個問題。函數

Queue.get()函數是個默認阻塞的函數,若是隊列爲空,會一直等待,相似於socket.recv。在測試的時候,程序一直卡在這裏,也就是說read()函數並無讀到隊列中的數據。測試

 

0x10 承spa

爲了解決驗證這個問題,我修改了一下代碼,打印相關的信息:.net

# encoding: utf-8
from multiprocessing import Process
from Queue import Queue


q = Queue(maxsize = 10)

# 經過web應用往隊列中添加數據
def put(num):
    q.put(num)

def read():
    print q.qsize()
    # while True:
    #     print q.get()


if __name__ == '__main__':
    put(2333)
    print q.qsize()
    Process(target=read, args=()).start()

打印出來的結果是1 0。在新開的進程中的隊列,果真是空的。線程

去查了一下資料(http://my.oschina.net/yangyanxing/blog/296052),給出的解釋是:隊列對象不能在父進程與子進程間通訊code

 

0x20 轉

最後得知multiprocessing提供了Queue供調用,可完美解決這個問題。

# encoding: utf-8
from multiprocessing import Process, Queue


q = Queue(10)

# 經過web應用往隊列中添加數據
def put(num):
    q.put(num)

def read():
    while True:
        print q.get()

if __name__ == '__main__':
    put(2333)
    print q.qsize()
    Process(target=read, args=()).start()

0x30 合

上面提到,在bottle中沒法使用multiprocessing,稍微查了一下,給出的緣由是線程中沒法開進程。還沒太理解。

相關文章
相關標籤/搜索