マルチスレッドのPythonの研究ノート

スレッドとは何ですか?

スレッド(英語:スレッド)が操作スケジューリングが可能なオペレーティングシステムの最小単位です。これは、プロセスの単位プロセスの実際の動作が含まれます。(Baiduの百科事典より抜粋)リソースは、スレッド間で共有されています

マルチスレッドとは何ですか?

(英語:マルチスレッド)マルチスレッド化、ソフトウェアまたはハードウェアから複数のスレッド技術の同時実行を達成するための手段は。(Baiduの百科事典から採取された)、それによって全体の処理性能を向上させる、によりハードウェアサポートする機能をマルチスレッドと同時に複数のスレッドを実行することができるとともにコンピュータ

マルチスレッド理解するには?

私たちのコンピュータと同等のマルチプロセスは、ブラウザを開き、音楽プレーヤーを開きます。そして、操作の一部は歌、一時停止など、音楽プレーヤーの内部でマルチスレッド同等で行いました。

マルチスレッド化を達成する方法

パイソンは、2つのモジュールを達成するためにマルチスレッド:threadthreadingめったに、より多くのモジュールをスレッド、基礎となるオペレーティングに傾斜していません。私たちは、一般的にthreadingモジュールで動作します。
ここで私は大体マルチスレッドの実装と行動を分析するために、小さなpy2.7デモを書き込むために使用されるものです。

# -*- coding: UTF-8 -*-
import threading

num = 1

def print_num(thread_name,num):
    while num<=20:
        print "%s:%d"%(thread_name,num)
        num+=1


try:
    t1 = threading.Thread(target=print_num,args=("Thread1",num))
    t2 = threading.Thread(target=print_num,args=("Thread2",num))
    t1.start()#开始线程1
    t2.start()#开始线程2
except:
    print "something error!"

に複数のスレッドを使用する必要の関数を作成しますthreading.Thread()たターゲットパラメータは、関数の名前は、パラメータを渡す必要の関数実行するために実行、引数パラメータの複数のスレッドを必要とする
、次にstart()実行を開始することを。
結果で見てみましょう:
ここに画像を挿入説明
あなたが見ることができ、スレッド1と2を開始するが、それでもあなたは2つの関数の時間を実行しているいくつかの共通のスレッドがある見ることができないものの、かなりの時間はprint_num、通常2つの機能を実行する必要があり、A上の機能に必要次回の実行が完了したコール、およびマルチスレッドを行うためには、それらを同時にできます。あなたは、同時にそれをしたい場合はnum、単に操作、実行numグローバル変数に変数を。

デーモンとは何ですか

実験では、二つのサブスレッドの終了後にメインスレッドが終了するまで待機します。あなたが直接、メインスレッドが終了したい場合は、使用できるsetDaemon(True)設定デーモンスレッドを次のような、子供の前に開始されます:

# -*- coding: UTF-8 -*-
import threading

num1 = 1

def print_num(thread_name):
    global num1
    while num1<=1000://注意这里的停止范围
        num1 += 1
        print thread_name+":"+str(num1)

try:
    t1 = threading.Thread(target=print_num,args=("Thread1",))
    t2 = threading.Thread(target=print_num,args=("Thread2",))
    t1.setDaemon(True)//设置守护进程
    t2.setDaemon(True)
    t1.start()
    t2.start()
except:
    print "something error!"

結果は次のとおりです。
ここに画像を挿入説明
あなたが見ることができ、IセットNUM1は、1000年の最後に追加しましたが、実際にはnumが18以上を追加しましたが。

ミューテックスは何ですか?用途は何ですか?

前述のリソースはスレッド間で共有され、問題を作成します。複数のスレッドが同時に同じデータを変更する際にダーティデータが発生する可能性があります。たとえば、次の
二つのスレッドT1、T2があり、グローバル変数a、T1、T2は1-1 +操作に同時に行われます。見た目には変化がないように見えるが、同時に+ T1およびT2に進むが、値は時々 3になったときは、使用している場合は、この時点で、データの問題が発生することがあります。
この場合、我々は、完全なオペレーティング一旦解放さ次にT2、T1、等となるようにロックを作動させる、改変することができないミューテックス、T1、必要
次のようにコードがあるの

# -*- coding: UTF-8 -*-
import threading

num1 = 1
lock = threading.Lock()

def print_num(thread_name):
    global num1

    while True:
        num1+=1
        num1-=1
        if num1 == 3:
            print thread_name+":"+str(num1)
            exit(0)

def run_thread(thread_name):
    lock.acquire()//获取锁
    try:
        print_num(thread_name)
    finally:
        lock.release()//释放锁
try:
    t1 = threading.Thread(target=run_thread,args=("Thread1",))
    t2 = threading.Thread(target=run_thread,args=("Thread2",))
    t1.start()
    t2.start()
except:
    print "something error!"

この時点では、もはやこの問題に実行されません。

再帰的なロックと非同期は、後続の更新を読んでいません

参考記事:
https://www.liaoxuefeng.com/wiki/1016959663602400/1017629247922688

公開された37元の記事 ウォンの賞賛2 ビュー1419

おすすめ

転載: blog.csdn.net/weixin_44377940/article/details/104864149
おすすめ