4

Pythonでスレッドを試しています。別のメソッドの実行中 (5 ~ 10 分間) に回転カーソルを表示したい。私はいくつかのコードを実行しましたが、これはどのように行うのでしょうか? 私はグローバルを使いたくないので、もっと良い方法があると思いますか?

c = True 

def b():
    for j in itertools.cycle('/-\|'):
        if (c == True):
            sys.stdout.write(j)
            sys.stdout.flush()
            time.sleep(0.1)
            sys.stdout.write('\b')
        else:
            return

def a():
    global c
    #code does stuff here for 5-10 minutes
    #simulate with sleep
    time.sleep(2)
    c = False

Thread(target = a).start()
Thread(target = b).start()

編集:

もう 1 つの問題は、処理が終了したときに、回転カーソルの最後の要素がまだ画面に表示されていることです。のようなもの\が印刷されます。

4

3 に答える 3

3

グローバル変数を除いて、ほとんど正しい軌道に乗っています。通常は、ロックやセマフォを使用して共有データへのアクセスを調整する必要がありましたが、この特別なケースでは、ショートカットを使用して、スレッドの 1 つが実行されているかどうかを代わりに使用できます。これが私が意味することです:

from threading import Thread
from threading import Event
import time
import itertools
import sys

def monitor_thread(watched_thread):
    chars = itertools.cycle('/-\|')
    while watched_thread.is_alive():
        sys.stdout.write(chars.next())
        sys.stdout.flush()
        time.sleep(0.1)
        sys.stdout.write('\b')

def worker_thread():
    # code does stuff here - simulated with sleep
    time.sleep(2)

if __name__ == "__main__":
    watched_thread = Thread(target=worker_thread)
    watched_thread.start()
    Thread(target=monitor_thread, args=(watched_thread,)).start()
于 2013-05-13T10:40:46.617 に答える
1

これは正しく同期されていません。しかし、今はすべてを説明するつもりはありません。これを読んでみてください: http://effbot.org/zone/thread-synchronization.htm

しかし、あなたの場合、物事が正しく同期されていないことはそれほど悪いことではありません。発生する可能性がある唯一のことは、バックグラウンド タスクが実際に必要とするよりも数ミリ秒長く回転バーが回転することです。

于 2013-05-13T09:09:15.033 に答える