ホームページ  >  記事  >  バックエンド開発  >  Python マルチスレッドとスレッド ロックの簡単な理解 (コード)

Python マルチスレッドとスレッド ロックの簡単な理解 (コード)

不言
不言オリジナル
2018-09-14 17:16:261900ブラウズ

この記事は、Python のマルチスレッドとスレッド ロックを簡単に理解 (コード) するものです。一定の参考価値があります。困っている友人は参照してください。お役に立てれば幸いです。

マルチスレッド スレッドモジュール スレッドの作成 独自のスレッドクラスの作成 スレッド通信 スレッド同期 相互排除メソッド スレッドロック @理解する必要があります! ! !

マルチスレッド

スレッドとは何ですか?

スレッドは、コンピュータのマルチコア リソースを使用してプログラムの同時実行を完了できるマルチタスク プログラミング方法でもあります。

スレッドは軽量プロセスとも呼ばれます

スレッドの特徴

スレッドはコンピュータのマルチコアによって割り当てられる最小単位です

プロセスには複数のスレッドを含めることができます

スレッドは、コンピュータ リソースを消費する実行中のプロセスでもあります。複数のスレッドがプロセスのリソースとスペースを共有します

スレッドの作成と削除は、プロセスよりもはるかに少ないリソースを消費します

複数のスレッドの実行は互いに干渉しません

#スレッドには、命令セット ID などの独自の属性もあります

スレッド化モジュールはスレッドを作成します

t =threading.Thread( )

name: スレッド名、空の場合のデフォルト値、Tread-1、Tread-2、Tread-3

target: スレッド関数

args : 要素グループ、位置に従ってスレッド関数にパラメータを渡します

kwargs: 辞書、キー値に従って郡関数にパラメータを渡します

関数: スレッド オブジェクトを作成します

パラメータ

t.start(): スレッドを開始し、スレッド関数を自動的に実行します。

t.join([timeout]): プロセスをリサイクルします

t.is_alive( ): スレッドのステータスを表示します

t.name(): スレッド名を表示します

t.setName(): スレッド名を設定します

t.daemon 属性: Byデフォルトでは、メイン スレッドは終了し、ブランチ スレッドの実行継続には影響しません。If True に設定すると、ブランチ スレッドはメイン スレッド

t.daemon = True

t とともに終了します。 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

from threading import Thread
from time import sleep
import os

# スレッド関数の作成
def music() :
グローバル a
print("a=",a)
a = 10000
for i in range(5):
sleep(1)
print("1212")

a = 1
t = Thread(target = music)
t.start()
t.join()
print("メインスレッドのa =", a) 独自のスレッド クラスを作成します

検査ポイント: クラスの使用、親クラスの呼び出し__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()

スレッド通信

通信方法: 複数のスレッドがプロセス空間のメモリを共有するため、スレッド間の通信はグローバル変数を使用して完了できます

注: スレッド間でグローバル変数を使用する場合スレッドの場合、通信のセキュリティを確保するために同期相互排他メカニズムが必要になることがよくあります。

スレッド同期相互排他メソッド

event

e = 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 サイトの他の関連記事を参照してください。

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