簡體   English   中英

如何在Python的兩個進程之間共享變量?

[英]How do you share a variable between two processes in Python?

我有兩個過程,一個將作業添加到隊列中,另一個將它們從同一隊列中移出並運行它們。 這應該可以正常工作,我不確定為什么worker永遠得不到任何工作。 這是我的代碼:

from multiprocessing import Process
from Queue import Queue
import time

q = Queue()

def queuer():
    while True:
        q.put("JOB")
        print "Adding JOB"
        time.sleep(1)

def worker():  
    while True:
        if not q.empty():
            item = q.get()
            print "Running", item
        else:
            print "No jobs"
            time.sleep(1)

a = Process(target=queuer)
a.start()

b = Process(target=worker)
b.start()

兩件事情:

  1. 您需要將Queue作為參數傳遞給兩個進程。
  2. 您應該使用multiprocessing.Queue,而不是Queue.Queue(用於線程)

該代碼對我有用:

from multiprocessing import Process, Queue
import time

def queuer(q):
    while True:
        q.put("JOB")
        print "Adding JOB"
        time.sleep(1)

def worker(q):  
    while True:
        if not q.empty():
            item = q.get()
            print "Running", item
        else:
            print "No jobs"
            time.sleep(1)



if __name__ == '__main__':
    q = Queue()
    a = Process(target=queuer, args=(q,))
    b = Process(target=worker, args=(q,))
    a.start()
    b.start()

一種可能性是使用來自多處理名稱空間的Queue對象。 在此處進行了描述: http : //docs.python.org/2/library/multiprocessing.html#sharing-state-between-processes

所以我修改了您的代碼。 我僅作了2處更改:-使用多處理隊列-避免使用全局變量,並將隊列作為參數傳遞給worker和queuer(這不是必需的,但是保持所有內容整潔是一個好習慣)

# use the Queue from the multiprocessing namespace!
from multiprocessing import Process, Queue
import time

q = Queue()

def queuer(q):
    while True:
        q.put("JOB")
        print "Adding JOB"
        time.sleep(1)

def worker(q):  
    while True:
        if not q.empty():
            item = q.get()
            print "Running", item
        else:
            print "No jobs"
            time.sleep(1)

a = Process(target=queuer, args =(q,))
a.start()

b = Process(target=worker, args = (q,))
b.start()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM