2016-11-12 52 views
3
import random 
import queue as Queue 
import _thread as Thread 

a = Queue.Queue() 

def af(): 
    while True: 
     a.put(random.randint(0,1000)) 

def bf(): 
    while True: 
     if (not a.empty()): print (a.get()) 

def main(): 
    Thread.start_new_thread(af,()) 
    Thread.start_new_thread(bf,()) 
    return 

if __name__ == "__main__": 
    main() 

上面的代碼工作正常極高的CPU佔用率基本多,我試圖用多用無濟於事。我曾嘗試具有無限循環和隊列

def main(): 
    multiprocessing.Process(target=af).run() 
    multiprocessing.Process(target=bf).run() 

def main(): 
    manager = multiprocessing.Manager() 
    a = manager.Queue() 
    pool = multiprocessing.Pool() 
    pool.apply_async(af) 
    pool.apply_async(bf) 

都沒有工作,任何人都可以幫我嗎?謝謝一堆^ _^

回答

0

在您使用Process第一選擇main,但你應該調用啓動該活動的方法是run(),正如人們所想,而是start()。您將希望通過適當的join()聲明來跟上這一點。繼multiprocessing信息(可在這裏:https://docs.python.org/2/library/multiprocessing.html),這裏是工作示例:

import random 
from multiprocessing import Process, Queue 

def af(q): 
    while True: 
     q.put(random.randint(0,1000)) 

def bf(q): 
    while True: 
     if not q.empty(): 
      print (q.get()) 

def main(): 
    a = Queue() 
    p = Process(target=af, args=(a,)) 
    c = Process(target=bf, args=(a,)) 
    p.start() 
    c.start() 
    p.join() 
    c.join() 


if __name__ == "__main__": 
    main() 
+0

感謝ü非常的答案,但是我沒有看到反對的線程方法CPU使用率的下降,什麼是我做錯了? – tomato

+0

我認爲這是預期的。擁有一個主要計算隨機數的「while true」循環肯定會佔用CPU資源。你可以通過很少的方法來調節,一種是將'sleep'語句放在* af'和'bf''函數中(比如說2秒),然後看看是否會降低CPU使用率。 – sal

0
def main(): 
    multiprocessing.Process(target=af).run() # will not return 
    multiprocessing.Process(target=bf).run() 

上面的代碼不起作用,因爲af不返回;沒有機會打電話給bf。您需要將run呼叫與start/join分開,以便兩者可以並行運行。 (+,使他們共享manage.Queue


爲了使第二代碼工作,你需要通過amanager.Queue對象)的功能。否則,他們將使用Queue.Queue全局對象,它不在進程之間共享;需要修改af,bf以接受amain通過a

def af(a): 
    while True: 
     a.put(random.randint(0, 1000)) 

def bf(a): 
    while True: 
     print(a.get()) 
def main(): 
    manager = multiprocessing.Manager() 
    a = manager.Queue() 
    pool = multiprocessing.Pool() 
    proc1 = pool.apply_async(af, [a]) 
    proc2 = pool.apply_async(bf, [a]) 

    # Wait until process ends. Uncomment following line if there's no waiting code. 
    # proc1.get() 
    # proc2.get()