2016-11-12 10 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

、しかし、1つは、と思うだろうとして、あなたが活動を開始するために呼び出す必要があります方法は、ないrun()が、むしろstart()。適切なjoin()ステートメントでこれをフォローしたいと思うでしょう。 (ここでは利用可能:https://docs.python.org/2/library/multiprocessing.htmlmultiprocessing内の情報に続いて、ここでの作業サンプルです:

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使用率の減少を参照していけない、答えを非常に多くのuをありがとう? – tomato

+0

私はそれが期待されると思います。大部分が乱数を計算する 'while true'ループを持つことは、CPUを大量に消費することになります。いくつかの方法でそれを抑制することができます.1つは 'af'と' bf'の両方の関数に 'sleep'文を入れ(2秒間)してCPU使用量を期待通りに減らすかどうかを見ます。 – sal

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

afが返されないため、上記のコードは機能しません。 bfに電話する機会はありません。 runの電話をstart/joinに分けて、両方を並行して実行できるようにする必要があります。あなたが関数にamanager.Queueオブジェクト)を渡す必要があり、


は、第2のコードの作業を行うには(+彼らはmanage.Queueを共有するために)。それ以外の場合は、プロセス間で共有されないグローバルオブジェクトQueue.Queueを使用します。 afbfを受け入れて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() 
関連する問題