2017-03-03 2 views
1

各スレッドに一意のアイテムをキューからポップして同時に実行させる方法がわかりません。これが現在書かれている方法は、直線的に実行され、キューから同じ項目をポップすることによって2つのスレッドが実行されます。キューからユニークなアイテムをポップして複数のスレッドで使用する

どのようにしてループからユニークなアイテムをキューから各スレッドに渡すことができますか?

import sys 
import subprocess 
import threading 
import Queue 

def pinger(host): 
    subprocess.Popen(['ping', '-c 1', '-W 1', host]) 

ping_hosts = ['google.com', 'yahoo.com', 'disney.com', 'myspace.com','www.pingler.com', 'www.pingmylink.com', 
'www.pingoat.net' ,'www.blogsearch.google.com' ,'pingmyblog.com', 'www.twingly.com', 'www.weblogs.com', 'auto-ping.com' ] 

ping_hosts = [ 'google.com', 'yahoo.com', 'disney.com'] 

def Main(): 
    q = Queue.Queue() 
    for item in ping_hosts: 
     q.put(item) 

    while q.qsize() != 0: 
     host = q.get() 
     t1 = threading.Thread(target=pinger, args=(host,) 
     t2 = threading.Thread(target=pinger, args=(host,) 
     t1.start() 
     t2.start() 
     t1.join() 
     t2.join() 

    print "Main Completed" 

if __name__ == '__main__': 
    Main() 

答えて

0

ワーカースレッドは、同じホスト値を与えるため、同じホストにpingを実行します。しかし、あなたのコードの主な問題は、メイン(単一)スレッドのキューを消費することです。あなたは、タスクをキュー(メインスレッド)に入れ、それらを(メインスレッド)取得し、ping(スレッド1、スレッド2)を実行してから2つのワーカースレッドを開始してから(メインスレッドに戻って)、キューにタスクがある間にそれを行います。

また、popenが実際にpingを行うための新しいプロセスを開始し、それはあなたが興味を持っている唯一のpingだ場合、あなたもちょうど、スレッドを必要としない場合があります

for host in ping_hosts: 
    subprocess.Popen(['ping', '-c 1', '-W 1', host]) 

しかし、あなたの質問を想定しpingを実行しないスレッドです... 通常、キューを使用する場合、「プロデューサ」と呼ばれる1つのスレッドにタスク(データ)を入れ、別のスレッドでタスク(データ)を取得して処理します。 "消費者"は、同時に実行されます。もちろん、いくつかの生産者と複数の消費者がいるかもしれません。

あなたが望むのは、ホストをキュー(メインスレッド)に入れ、ワーカースレッドを開始し、キュー(スレッド1、スレッド2)からデータを取得し、それを処理します1、スレッド2)を同時に実行します。私はいくつかのpingコマンド出力は無関係のように削除

python2 test.py 
Thread 1: pinging 'google.com' 
Pinging 'google.com' 
Thread 2: pinging 'yahoo.com' 
Pinging 'yahoo.com' 
Thread 1: pinging 'disney.com' 
Pinging 'disney.com' 
Main Completed 
PING google.com (74.125.232.231) 56(84) bytes of data. 
PING yahoo.com (206.190.36.45) 56(84) bytes of data. 
PING disney.com (199.181.131.249) 56(84) bytes of data. 
... 
--- google.com ping statistics --- 
... 
--- disney.com ping statistics --- 
... 
--- yahoo.com ping statistics --- 
... 

import subprocess 
import threading 
import Queue 


def ping(host): 
    """Pings a host.""" 
    print("Pinging '%s'" % host) 
    subprocess.Popen(['ping', '-c 1', '-W 1', host]) 


def pinger_thread(thread_name, task_queue): 
    """Gets the data from the queue and processes it.""" 
    while task_queue.qsize() != 0: 
     host = task_queue.get() 
     print("%s: pinging '%s'" % (thread_name, host)) 
     ping(host) 


def main(): 
    ping_hosts = ['google.com', 'yahoo.com', 'disney.com'] 

    # Fill the queue 
    q = Queue.Queue() 
    for item in ping_hosts: 
     q.put(item) 

    # Start the threads, that will consume data from the queue 
    t1 = threading.Thread(target=pinger_thread, args=("Thread 1", q)) 
    t2 = threading.Thread(target=pinger_thread, args=("Thread 2", q)) 
    t1.start() 
    t2.start() 
    t1.join() 
    t2.join() 

    print("Main Completed") 


if __name__ == '__main__': 
    main() 

出力:

は次のように試してみてください。しかし重要なのは、ホストが順番に2つのスレッドで処理されていることが分かります。

+0

Nikita、すばらしい返答をいただきありがとうございます。これは本当にスレッドの動作を理解するのに役立ちました。 noobが理解できるように時間を割いてくれてありがとう! –

+0

@MikeDevlin、問題はありません、幸運プログラミングとPythonを学ぶ! ) – Nikita

関連する問題