ホームページ  >  記事  >  バックエンド開発  >  Python スレッドのソート

Python スレッドのソート

巴扎黑
巴扎黑オリジナル
2016-12-09 14:11:471468ブラウズ

スレッドには 5 つの状態があります

新規、準備完了、実行中、ブロック、停止です。

ブロックには 3 つの状況があります。

同期ブロックとは、ロックが正常に取得されると、スレッドがこの状態に入り、実行状態に戻ります。待機ブロッキングとは、他のスレッドからの通知を待機する状態を指します。スレッドが条件付きロックを取得した後、「wait」を呼び出すと、他のスレッドが通知を送信すると、スレッドは同期ブロッキング状態になり、条件付きロックを獲得するために競合します。もう一度;

その他のブロックとは、time.sleep()、別のスレッド .join() の呼び出し、または IO の待機中にブロックすることを指します。この状態では、スレッドは取得したロックを解放しません。

Python では、スレッドを使用する 2 つの方法が提供されています。1 つは関数型で、もう 1 つはクラス パッケージ化です。

* スレッド
* スレッド化

1. スレッド:

>>> import thread
>>> dir(thread)
['LockType', '__doc__', '__name__', '__package__', '_count', '_local', 'allocate', 'allocate_lock', 'error', 'exit', 'exit_thread', 'get_ident', 'interrupt_main', 'stack_size', 'start_new', 'start_new_thread']

thread.start_new_thread ( function , args [ , kwargs ] )

thread モジュールで start_new_thread() 関数を呼び出して、新しいスレッドを生成します。


2. スレッド化:

>>> import threading
>>> dir(threading)
['BoundedSemaphore', 'Condition', 'Event', 'Lock', 'RLock', 'Semaphore', 'Thread', 'ThreadError', 'Timer', '_BoundedSemaphore', '_Condition', '_DummyThread', '_Event', '_MainThread', '_RLock', '_Semaphore', '_Timer', '_VERBOSE', '_Verbose', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_active', '_active_limbo_lock', '_after_fork', '_allocate_lock', '_counter', '_enumerate', '_format_exc', '_get_ident', '_limbo', '_newname', '_pickSomeNonDaemonThread', '_profile_hook', '_shutdown', '_sleep', '_start_new_thread', '_sys', '_test', '_time', '_trace_hook', 'activeCount', 'active_count', 'currentThread', 'current_thread', 'deque', 'enumerate', 'local', 'setprofile', 'settrace', 'stack_size', 'warnings']
>>> dir(threading.Thread)
['_Thread__bootstrap', '_Thread__bootstrap_inner', '_Thread__delete', '_Thread__exc_clear', '_Thread__exc_info', '_Thread__initialized', '_Thread__stop', '__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_block', '_note', '_reset_internal_locks', '_set_daemon', '_set_ident', 'daemon', 'getName', 'ident', 'isAlive', 'isDaemon', 'is_alive', 'join', 'name', 'run', 'setDaemon', 'setName', 'start']

スレッド化モジュールによって提供される一般的なメソッド:


threading.currentThread(): 現在のスレッド変数を返します。

threading.enumerate(): 実行中のスレッドを含むリストを返します。実行中とは、スレッドの開始後から終了までを指します。開始前と終了後のスレッドは除きます。

threading.activeCount(): 実行中のスレッドの数を返します。これは、len(threading.enumerate()) と同じ結果になります。

threading.Thread メソッドを継承し、run メソッドをオーバーライドします。

threading.Threadクラスの初期化関数プロトタイプ: def __init__(self, group=None, target=None, name=None, args=(), kwargs={})
パラメータグループは将来の拡張のために予約されています
パラメータのターゲットは、スレッドの開始後に実行される呼び出し可能なオブジェクト (アクティビティ [アクティビティ] とも呼ばれます) です。
パラメータ名はスレッドの名前です。デフォルト値は「Thread-N」です。N は数字です。
パラメータargsとkwargsは、それぞれtarget呼び出し時のパラメータリストとキーワードパラメータを表します。


join() メソッドを使用すると、このメソッドを呼び出すスレッドは、Thread オブジェクトが完了するまで待機してから実行を再開します。
Thread.join を呼び出すと、呼び出されたスレッドが終了するかタイムアウトになるまで、呼び出し元のスレッドがブロックされます。パラメータ timeout はタイムアウト時間を示す数値タイプです。このパラメータが指定されていない場合、呼び出されたスレッドは、呼び出されたスレッドが終了するまでブロックされます。

threading.Lock オブジェクト: mutex、acquire() メソッドと release() メソッドがあります

RLock は同じスレッド内で複数回取得できます。しかし、ロックはそれを許しません。注: RLock を使用する場合、acquire と release はペアで指定する必要があります。つまり、占有されているロックを実際に解放するには、acquire が n 回呼び出され、release が n 回呼び出される必要があります。

Threading.Condition オブジェクト: 条件変数。このオブジェクトが作成されると、Lock オブジェクトが含まれます (条件変数は常にミューテックスと一緒に使用されるため)。潜在的な Lock オブジェクトを制御するために、Condition オブジェクトに対してacquire() メソッドと release() メソッドを呼び出すことができます。



Condition.wait([timeout]): wait メソッドは占有されている内部メモリを解放し、スレッドは通知の受信後にウェイクアップされるかタイムアウトになるまで一時停止されます (タイムアウト パラメーターが指定されている場合)。スレッドが目覚めてスレッドを再び占有すると、プログラムは実行を継続します。

Condition.notify(): 一時停止されたスレッドを起動します (一時停止されたスレッドがある場合)。注:notify() メソッドは、占有されているメモリを解放しません。

Condition.notifyAll() 一時停止されているすべてのスレッドを起動します (一時停止されているスレッドがある場合)。注: これらの方法では、占有されているメモリは解放されません。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。