web-dev-qa-db-ja.com

スレッドクラスを使用してスレッドを一時停止する

スレッドで実行するようにスケジュールした長いプロセスがあります。そうしないと、wxpythonアプリケーションのUIがフリーズするためです。

使っています

threading.Thread(target = myLongProcess).start()

スレッドを開始すると機能しますが、スレッドを一時停止して再開する方法がわかりません。上記のメソッドのpythonドキュメントを調べましたが、見つかりませんでした。

誰かが私がこれを行う方法を提案できますか?

ありがとうございました。

19
jimbo

答えが見つかるまで、私は同じ問題を抱えていました。

私もいくつかの速度テストを行いました。フラグを設定してアクションを実行する時間は、低速の2プロセッサLinuxボックスで0.00002秒と快適です。

Set()およびclear()イベントを使用したスレッド一時停止テストの例

Rich O'Reganによる

import threading
import time

# This function gets called by our thread.. so it basically becomes the thread innit..                    
def wait_for_event(e):
    while True:
        print '\tTHREAD: This is the thread speaking, we are Waiting for event to start..'
        event_is_set = e.wait()
        print '\tTHREAD:  WHOOOOOO HOOOO WE GOT A SIGNAL  : %s', event_is_set
        e.clear()

# Main code.. 
e = threading.Event()
t = threading.Thread(name='your_mum', 
                     target=wait_for_event,
                     args=(e,))
t.start()

while True:
    print 'MAIN LOOP: still in the main loop..'
    time.sleep(4)
    print 'MAIN LOOP: I just set the flag..'
    e.set()
    print 'MAIN LOOP: now Im gonna do some processing n shi-t'
    time.sleep(4)
    print 'MAIN LOOP:  .. some more procesing im doing   yeahhhh'
    time.sleep(4)
    print 'MAIN LOOP: ok ready, soon we will repeat the loop..'
    time.sleep(2)
12
Rich

他のスレッドがスレッドを強制的に一時停止する方法はありません(他のスレッドがそのスレッドを強制終了する方法と同じです)。ターゲットスレッドは、適切な「フラグ」(threading.Conditionは、一時停止/一時停止解除の場合に適している可能性があります)。

UNIXプラットフォーム(基本的にはWindows以外)を使用している場合は、multiprocessing-thatの代わりにthreadingを使用できます。はるかに強力で、「他のプロセス」にシグナルを送信できます。 [〜#〜] sigstop [〜#〜] プロセスを無条件に一時停止し、 [〜#〜] sigcont [〜#〜] 続行します(プロセスで必要な場合)一時停止する直前に何かを行う場合は、 [〜#〜] sigtstp [〜#〜] シグナルも考慮してください。このシグナルは、他のプロセスがキャッチして、このような一時停止前のタスクを実行できます( Windowsでも同じ効果が得られますが、私はそれらについての知識がありません)。

8
Alex Martelli

マルチプロセッシングモジュールはWindowsで正常に動作します。こちらのドキュメントを参照してください(最初の段落の終わり):

http://docs.python.org/library/multiprocessing.html

WxPython IRCチャネルで、マルチプロセッシングを試しているフェローが2人いて、うまくいったと言っていました。残念ながら、マルチプロセッシングとwxPythonの良い例を書いた人はまだいません。

あなた(またはここにいる他の誰か)が何かを思いついた場合は、ここでスレッド化するwxPython wikiページに追加してください: http://wiki.wxpython.org/LongRunningTasks

スレッドとキューを使用した興味深い例がいくつかあるので、そのページをチェックアウトすることをお勧めします。

2
Mike Driscoll

シグナルを使用できます: http://docs.python.org/library/signal.html#signal.pause

シグナルの使用を避けるために、トークンパッシングシステムを使用できます。メインUIスレッドから一時停止したい場合は、おそらくQueue.Queueオブジェクトを使用して通信できます。

スレッドに一定時間のスリープを通知するメッセージをキューにポップするだけです。

または、メインUIスレッドからキューにトークンを継続的にプッシュすることもできます。ワーカーは、N秒ごとにキューをチェックする必要があります(0.2など)。デキューするトークンがない場合、ワーカースレッドはブロックします。再開したい場合は、メインスレッドからキューにトークンを再度プッシュし始めます。

2
dpn

スレッド中断用のWindows API をご覧ください。

私の知る限り、POSIX/pthreadに相当するものはありません。さらに、スレッドハンドル/ IDが Pythonから利用可能 であるかどうかを確認できません。 Pythonには潜在的な問題もあります。そのスケジューリングはネイティブスケジューラを使用して行われるため、特にGILを保持している間にスレッドが中断された場合、スレッドが中断することを期待する可能性はほとんどありません。

1
Matt Joiner