2016-12-23 5 views
0

私はコンソールに出力するスレッドを実行しています。スレッドで変数の変更をリスンするプロセッサ効率的な方法

コンソールに出力するタイミングを知るために、私は変数の変更にリスナーを使用しています。

しかし、そのリスナーはループ中に多くの処理能力を消費しています。変更を聞くより効率的な方法はありますか? 、あなたはあなたのために物事を印刷するには、別のスレッドを必要としない

def output_console_item(message, sound=None, over_ride_lock=False): 
    log = StandardLogger(logger_name='output_console_item') 
    # lock to serialize console output 
    lock = threading.Lock() 

    def print_msg(message): 

     # Wait until console lock is released. 
     if over_ride_lock is False: 
      while True: 
       if CONSOLE_CH.CONSOLE_LOCK is False: 
        break 
       # time.sleep(0.10) 

     # Make sure the whole print completes or threads can mix up output in one line. 
     with lock: 
      print(message) 

    return 

thread = Thread(target=print_msg, args=(message,)) 
thread.start() 
thread.join() 

if sound: 
    thread = Thread(target=play_sound, args=(sound,)) 
    thread.start() 
    thread.join() 

答えて

1

あなたは安全なプリントを作成することができ、

lock = threading.Lock() 
def safe_print(message): 
    with lock: 
     print message 

と使用のようなもの:ここで

コードですそれはあなたのすべてのスレッドで

さらに良いpythonモジュールのロギングはすでにt hreadsafe

編集:

あなたは本当のロック するCONSOLE_LOCKを変更し、それをCONSOLE_LOCK = Trueのをやって、この

def print_msg(message): 

    # Wait until console lock is released. 
    if over_ride_lock is False: 
     with CONSOLE_LOCK: 
      pass 


    with lock: 
     print(message) 

、代わりのようなものを使用することができますCONSOLE_LOCK.acquireを行うと、代わりのCONSOLE_LOCKをやって= False do CONSOLE_LOCK.release()

+0

私はロック変数を使用しています。コンソールの出力をロックするが、他の人のためにオープンに保つ。そのことを念頭に置いて、私は印刷出力をロックするだけでもっと多くのことをする必要があります。私はCONSOLE_LOCK変数の変更を聞く必要があります。 – Emily

+0

また、print_msgがスレッド化されている理由は、サウンドを並行して再生できるようにするためです。 – Emily

+0

また、より多くの機能をロギングする必要があります。コマンドライン出力でサウンドを出力できるようにする必要があります。 – Emily

関連する問題