ホームページ >バックエンド開発 >Python チュートリアル >Python マルチスレッドとスレッド ロックの簡単な理解 (コード)
この記事は、Python のマルチスレッドとスレッド ロックを簡単に理解 (コード) するものです。一定の参考価値があります。困っている友人は参照してください。お役に立てれば幸いです。
マルチスレッド スレッドモジュール スレッドの作成 独自のスレッドクラスの作成 スレッド通信 スレッド同期 相互排除メソッド スレッドロック @理解する必要があります! ! !
マルチスレッド
スレッドとは何ですか?
スレッドは、コンピュータのマルチコア リソースを使用してプログラムの同時実行を完了できるマルチタスク プログラミング方法でもあります。
スレッドは軽量プロセスとも呼ばれます
スレッドの特徴
スレッドはコンピュータのマルチコアによって割り当てられる最小単位です
プロセスには複数のスレッドを含めることができます
スレッドは、コンピュータ リソースを消費する実行中のプロセスでもあります。複数のスレッドがプロセスのリソースとスペースを共有します
スレッドの作成と削除は、プロセスよりもはるかに少ないリソースを消費します
複数のスレッドの実行は互いに干渉しません
#スレッドには、命令セット ID などの独自の属性もありますスレッド化モジュールはスレッドを作成しますt =threading.Thread( )name: スレッド名、空の場合のデフォルト値、Tread-1、Tread-2、Tread-3target: スレッド関数 args : 要素グループ、位置に従ってスレッド関数にパラメータを渡しますkwargs: 辞書、キー値に従って郡関数にパラメータを渡します関数: スレッド オブジェクトを作成しますパラメータt.start(): スレッドを開始し、スレッド関数を自動的に実行します。 t.join([timeout]): プロセスをリサイクルします t.is_alive( ): スレッドのステータスを表示しますt.name(): スレッド名を表示します t.setName(): スレッド名を設定します t.daemon 属性: Byデフォルトでは、メイン スレッドは終了し、ブランチ スレッドの実行継続には影響しません。If True に設定すると、ブランチ スレッドはメイン スレッドt.daemon = Truet とともに終了します。 setDaemon(Ture)メソッドの設定#!/usr/bin/env python3 from threading import Thread from time import sleep import os # 创建线程函数 def music(): sleep(2) print("分支线程") t = Thread(target = music) # t.start() # ****************************** print("主线程结束---------") '''没有设置的打印结果 主线程结束--------- 分支线程 ''' '''设置为True打印结果 主线程结束--------- '''threading .currentThread: 現在のスレッド オブジェクトを取得します@ここのコードは、子スレッドが同じプロセス内で変数を共有することを示しています #!/usr/bin/env python3 検査ポイント: クラスの使用、親クラスの呼び出し__init__ メソッド、関数 *パラメータ受け渡しおよび **パラメーター受け渡し
from threading import Thread import time class MyThread(Thread): name1 = 'MyThread-1' def __init__(self,target,args=(), kwargs={}, name = 'MyThread-1'): super().__init__() self.name = name self.target = target self.args = args self.kwargs = kwargs def run(self): self.target(*self.args,**self.kwargs) def player(song,sec): for i in range(2): print("播放 %s:%s"%(song,time.ctime())) time.sleep(sec) t =MyThread(target = player, args = ('亮亮',2)) t.start() t.join()スレッド通信通信方法: 複数のスレッドがプロセス空間のメモリを共有するため、スレッド間の通信はグローバル変数を使用して完了できます注: スレッド間でグローバル変数を使用する場合スレッドの場合、通信のセキュリティを確保するために同期相互排他メカニズムが必要になることがよくあります。スレッド同期相互排他メソッドevente = threading.Event():イベント オブジェクト e.wait([timeout]): ステータスを設定します。設定されている場合、この関数はブロックされ、タイムアウトはタイムアウト時間です。e.set: 変更e を設定状態にしますe.clear: 設定状態を削除します
import threading from time import sleep def fun1(): print("bar拜山头") global s s = "天王盖地虎" def fun2(): sleep(4) global s print("我把限制解除了") e.set() # 解除限制,释放资源 def fun3(): e.wait() # 检测限制 print("说出口令") global s if s == "天王盖地虎": print("宝塔镇河妖,自己人") else: print("打死他") s = "哈哈哈哈哈哈" # 创建同步互斥对象 e = threading.Event() # 创建新线程 f1 = threading.Thread(target = fun1) f3 = threading.Thread(target = fun3) f2 = threading.Thread(target = fun2) # 开启线程 f1.start() f3.start() f2.start() #准备回收 f1.join() f3.join() f2.join()スレッドロックlock = threading.Lock() : ロック オブジェクトの作成 lock.acquire(): ロック lock.release(): ロック解除 また、 with を使用してロックすることもできます。
1 with lock: 2 ... 3 ...Python スレッド (グローバル インタプリタ) に関する GIL の問題: python---->マルチスレッドのサポート---->同期の相互排他の問題---->追加ロック ソリューション----> スーパー ロック (インタープリタをロック)----> インタプリタは同時に 1 つのスレッドのみを解釈できます---> 効率の低下につながります結果:インタプリタは一度に 1 つのスレッドしか解釈して実行できないため、Python スレッドの効率は低くなります。ただし、IO ブロックが発生すると、スレッドは積極的にインタプリタを放棄するため、Python スレッドはより適しています。高レイテンシ IO プログラムの同時実行
##解決策
同時実行を完了するプロセスを使用してみてください (言及されていないものと同じ)
C インタープリターの使用は適切ではありません (使用C#、JAVA)
使用してみる 複数のソリューションを組み合わせて同時操作が実行され、スレッドが高遅延 IO
として使用されます。以上がPython マルチスレッドとスレッド ロックの簡単な理解 (コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。