ホームページ  >  記事  >  バックエンド開発  >  Python スレッド マルチスレッド プログラミングの例

Python スレッド マルチスレッド プログラミングの例

WBOY
WBOYオリジナル
2016-06-16 08:42:001206ブラウズ

Python でマルチスレッドを実装するには 2 つの方法があります:

関数、スレッドクラス

1. 機能

スレッド モジュールで start_new_thread() 関数を呼び出してスレッドを作成し、スレッド関数の形式でスレッドに何を行うかを指示します

コードをコピー コードは次のとおりです:

# -*- コーディング: utf-8 -*-
インポートスレッド
def f(名前):
#スレッド関数を定義
print "これは " + 名前

if __name__ == '__main__':
thread.start_new_thread(f, ("thread1",))
#start_new_thread() を使用してスレッド関数とその他のパラメータを呼び出します
一方 1:
パス

しかし、このメソッドをサポートする他のメソッドは今のところ見つかりません。メインスレッドの待機も while 1 メソッドで解決する必要があります。

2. スレッドクラス

threading モジュールを呼び出し、threading.Thread のサブクラスを作成してカスタム スレッド クラスを取得します。

コードをコピー コードは次のとおりです:

# -*- コーディング: utf-8 -*-
インポートスレッド
クラス Th(threading.Thread):
def __init__(自分, 名前):
Threading.Thread.__init__(self)
Self.t_name = 名前
#親クラスのコンストラクターを呼び出します

def run(self):
#run() 関数を書き直すと、スレッドはデフォルトでこの関数から実行を開始します
「これは」 + self.t_name
を印刷します
if __name__ == '__main__':
thread1 = Th("Thread_1")
thread1.start()
#start() 関数はスレッドを開始し、自動的に run() 関数を実行します

threading.Thread クラスの継承可能な関数:
getName() はスレッドオブジェクト名を取得します
setName() はスレッド オブジェクト名を設定します
join() は、後続のコマンド
を実行する前に、呼び出し元のスレッドが終了するのを待ちます。 setDaemon(bool) ブロック モード、True: 親スレッドは子スレッドの終了を待機しません。False は待機します。デフォルトは False
isDaemon() は、子スレッドが親スレッドとともに終了するかどうか、つまり setDaemon() によって設定された値を決定します
isAlive() はスレッドが実行されているかどうかを判断します

コードをコピー コードは次のとおりです:

インポートスレッド
インポート時間
クラス Th(threading.Thread):
def __init__(self, thread_name):
Threading.Thread.__init__(self)
Self.setName(スレッド名)

def run(self):
Print "これはスレッドです " + self.getName()
range(5) 内の i の場合:
Time.sleep(1)
print str(i)
print self.getName() + "終わりました"

join() ブロック待機

コードをコピー コードは次のとおりです:

if __name__ == '__main__':
Thread1 = Th("T1 ")
thread1.start()
#thread1.join()
「メインスレッドは終了しました」を出力

thread1.join() を使用しない場合、次の結果が得られます:

コードをコピー コードは次のとおりです:

これはスレッド T1
です メインスレッドは終了しました
0
1
2
T1が終わりました

thread1 の完了を待たずに、後続のステートメントを実行します。
thread1.join() を追加し、次の結果が得られました:
コードをコピー コードは次のとおりです:

これはスレッド T1
です 0
1
2
T1が終わりました
メインスレッドは終了しました

次のステートメントを実行する前に、ブロックしてスレッド 1 が終了するのを待ちます

メインスレッド待機中

コードをコピー コードは次のとおりです:

if __name__ == '__main__':
thread1 = Th("T1 ")
thread1.setDaemon(True)
#スレッド実行前にこの量を設定します
thread1.start()
print "メインスレッドは終了しました"

エラー: スレッド T1 での例外 (インタープリターのシャットダウン中に発生する可能性が高い):
つまり、メインスレッドは子スレッドを待たずに終了します。

複数のサブスレッド

コードをコピー コードは次のとおりです:

if __name__ == '__main__':
range(3) 内の i の場合:
t = Th(str(i))
t.start()
「メインスレッドは終了しました」を出力

ここでの t は複数のスレッドを同時に処理できます。つまり、 t はスレッド ハンドルであり、再割り当てはスレッドに影響しません。

ここで奇妙なのは、t.run() の実行時に他のスレッドが実行されないことです。分かりにくいですが、start()を使ってみましょう。当面は、start() はノンブロッキング並列処理であるのに対し、run はブロッキングであることが理解されています。

スレッドロック

スレッド化は、スレッドの同期を実現するためにスレッド ロックを提供します。

コードをコピー コードは次のとおりです:

インポートスレッド
インポート時間
クラス Th(threading.Thread):
def __init__(self, thread_name):
Threading.Thread.__init__(self)
Self.setName(スレッド名)

def run(self):
threadLock.acquire()
#ロックを取得してから実行
Print "これはスレッドです " + self.getName()
range(3) 内の i の場合:
Time.sleep(1)
print str(i)
print self.getName() + " は終わりました"
threadLock.release()
#リリースロック
if __name__ == '__main__':
threadLock = threading.Lock()
#グローバルロックを設定します
thread1 = Th('Thread_1')
thread2 = Th('Thread_2')
thread1.start()
thread2.start()

結果を取得します:

コードをコピー コードは次のとおりです:

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