スレッドで実行するようにスケジュールした長いプロセスがあります。そうしないと、wxpythonアプリケーションのUIがフリーズするためです。
私が使用しているもの:
threading.Thread(target=myLongProcess).start()
スレッドを開始すると機能しますが、スレッドを一時停止して再開する方法がわかりません。上記のメソッドについてPythonのドキュメントを調べましたが、見つかりませんでした。
誰かが私がこれを行う方法を提案できますか?
スレッドで実行するようにスケジュールした長いプロセスがあります。そうしないと、wxpythonアプリケーションのUIがフリーズするためです。
私が使用しているもの:
threading.Thread(target=myLongProcess).start()
スレッドを開始すると機能しますが、スレッドを一時停止して再開する方法がわかりません。上記のメソッドについてPythonのドキュメントを調べましたが、見つかりませんでした。
誰かが私がこれを行う方法を提案できますか?
いくつかの速度テストも行いました。フラグを設定してアクションを実行するまでの時間は、低速の 2 プロセッサの Linux ボックスで 0.00002 秒と非常に高速です。
イベントを使用set()
したスレッド一時停止テストの例:clear()
import threading
import time
# This function gets called by our thread.. so it basically becomes the thread init...
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)
# or for Python >= 3.6
# print(f'\tTHREAD: WHOOOOOO HOOOO WE GOT A SIGNAL : {event_is_set}')
e.clear()
# Main code
e = threading.Event()
t = threading.Thread(name='pausable_thread',
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')
time.sleep(4)
print('MAIN LOOP: .. some more processing im doing yeahhhh')
time.sleep(4)
print('MAIN LOOP: ok ready, soon we will repeat the loop..')
time.sleep(2)
他のスレッドがスレッドを強制的に一時停止する方法はありません (他のスレッドがそのスレッドを強制終了する方法以上に)。ターゲット スレッドは、適切な「フラグ」をときどきチェックすることによって協力する必要があります (threading.Condition
一時停止/一時停止解除には適切な場合があります)。場合)。
unix-y プラットフォーム (基本的に Windows 以外) を使用している場合は、multiprocessing
代わりにthreading
--を使用できます。これははるかに強力で、「他のプロセス」にシグナルを送信できます。SIGSTOPは無条件にプロセスを一時停止し、SIGCONTはそれを続行する必要があります (プロセスが一時停止する直前に何かを行う必要がある場合は、SIGTSTPシグナルも考慮してください。他のプロセスは、このような中断前の義務を実行するためにキャッチできます。 Windows でも同じ効果がありますが、私はそれらについて詳しく知りません)。
シグナルを使用できます: http://docs.python.org/library/signal.html#signal.pause
シグナルの使用を避けるには、トークン パッシング システムを使用できます。メイン UI スレッドから一時停止したい場合は、おそらく Queue.Queue オブジェクトを使用して通信することができます。
スレッドに一定時間スリープすることを伝えるメッセージをキューに入れるだけです。
または、メイン UI スレッドからキューにトークンを継続的にプッシュすることもできます。ワーカーは、N 秒 (0.2 など) ごとにキューをチェックする必要があります。デキューするトークンがない場合、ワーカー スレッドはブロックされます。もう一度開始したい場合は、メインスレッドからトークンをキューにプッシュし始めます。
マルチプロセッシングモジュールはWindowsで正常に動作します。こちらのドキュメントを参照してください(最初の段落の終わり):
http://docs.python.org/library/multiprocessing.html
wxPython IRCチャネルでは、マルチプロセッシングを試しているフェローが2人いて、うまくいったと言っていました。残念ながら、マルチプロセッシングとwxPythonの良い例を書いた人はまだいません。
あなた(またはここにいる他の誰か)が何かを思いついた場合は、ここでスレッド化するwxPython wikiページに追加してください:http ://wiki.wxpython.org/LongRunningTasks
スレッドとキューを使用した興味深い例がいくつかあるので、そのページをチェックアウトすることをお勧めします。
私の知る限り、POSIX/pthreadに相当するものはありません。さらに、スレッドハンドル/IDがPythonから利用可能になっているかどうかを確認できません。Pythonには潜在的な問題もあります。そのスケジューリングはネイティブスケジューラを使用して行われるため、特にGILを保持している間にスレッドが中断された場合、スレッドが中断することを期待している可能性はほとんどありません。