2017-01-24 7 views
0

asyncioを使用してイベント消費者スレッドからbusy_waitを回避するにはどうすればよいですか? 私は他のスレッドによって処理されるイベントを生成するメインスレッドを持っています。それはイベントキューは、その中のいくつかのアイテムを持っているかどうかを確認しようとしているとして、私のイベントスレッドはpythonがイベント処理スレッドでビジー待機を避ける

from Queue import Queue 

from threading import Thread 
import threading 

def do_work(p): 
    print("print p - %s %s" % (p, threading.current_thread())) 

def worker(): 
    print("starting %s" % threading.current_thread()) 
    while True: # <------------ busy wait 
     item = q.get() 
     do_work(item) 
     time.sleep(1) 
     q.task_done() 

q = Queue() 
t = Thread(target=worker) 
t.daemon = True 
t.start() 

for item in range(20): 
    q.put(item) 

q.join()  # block until all tasks are done 

どのように私はasyncio使用して上記のコードに似た何かを達成することができます... busy_waitましたか?

答えて

0

asyncioは、IOで作業している場合(たとえば、HTTP server or clientを実行している場合)にのみ意味があります。次の例では、asyncio.sleep()はI/Oコールをシミュレートします。あなたはI/Oタスクの束を持っている場合、それはのような単純な取得することができます。

import asyncio 

import random 

async def do_work(i): 
    print("[#{}] work part 1".format(i)) 
    await asyncio.sleep(random.uniform(0.5, 2)) 
    print("[#{}] work part 2".format(i)) 
    await asyncio.sleep(random.uniform(0.1, 1)) 
    print("[#{}] work part 3".format(i)) 
    return "#{}".format(i) 


loop = asyncio.get_event_loop() 
tasks = [do_work(item + 1) for item in range(20)] 
print("Start...") 
results = loop.run_until_complete(asyncio.gather(*tasks)) 
print("...Done!") 
print(results) 
loop.close() 

ensure_futureasyncio.Queueを参照してください。

関連する問題