Pythonマルチスレッド:Threadクラスの使用法

Threadオブジェクトを作成して実行する必要があります。各スレッドオブジェクトはスレッドを表します。各スレッドでは、プログラムにさまざまなタスクを処理させることができます。これはマルチスレッドプログラミングです。

Threadオブジェクトを作成するには、次の2つの方法があり
ます。1。Threadを直接作成し、クラスのコンストラクターから呼び出し可能オブジェクトを渡します。この呼び出し可能オブジェクトは、タスクを処理するためのコールバック関数です。
2. Threadを継承するカスタムクラスを記述し、run()メソッドをオーバーライドし、ru()メソッドでタスク処理コードを記述してから、Threadのサブクラスを作成します。

1.スレッドオブジェクトを直接作成します

# 导入Python标准库中的Thread模块 
from threading import Thread 
# 创建一个线程 
mthread = threading.Thread(target=function_name, args=(function_parameter1, function_parameterN)) 
# 启动刚刚创建的线程 
mthread .start()

パラメータの説明:
function_name:
スレッドで実行する必要のあるメソッドの名前args:スレッドの実行メソッドで受け取るパラメータ。この属性はタプルです。パラメータが1つしかない場合は、最後にコンマを追加する必要があります。 。
1)マルチスレッド
スレッドを作成する構築方法では、最も重要なパラメータはターゲットであるため、スレッドが正常に実行されるように、呼び出し可能なオブジェクトを割り当てる必要があります。
Threadオブジェクトを開始する場合は、そのstart()メソッドを呼び出します。

import threading
import time
def test():
    for i in range(5):
        print('The {} child thile '.format(i))
        time.sleep(1)
thread = threading.Thread(target=test)
thread.start()
# thread.join()

for i in range(5):
    print('The {} main thile '.format(i))
    time.sleep(1)


上記のコードは非常に単純で、メインスレッドで5回、子スレッドで5回出力されます。


The 0 child thile The 0 main thile 

The 1 child thile The 1 main thile 

The 2 child thile 
The 2 main thile 
The 3 main thile The 3 child thile 

The 4 child thile 
The 4 main thile 

上記のcallableにはパラメーターがありません。パラメーターを渡す必要がある場合、argsは固定パラメーターであり、kwargsは可変パラメーターです。

2)スレッド名

各スレッドには、コンストラクターで割り当てることができるスレッドの名前を表すname属性があります。コンストラクターで名前が割り当てられていない場合、デフォルトは「Thread-N」の形式であり、Nは数値です。

import threading
import time
def test():
    for i in range(5):
        print(threading.current_thread().name+" test ",i)
        time.sleep(1)
thread=threading.Thread(target=test)
thread.start()
for i in range(5):
    print("This is "+threading.current_thread().name+"main ",i)
    time.sleep(1)

出力は次のとおりです。

Thread-1 test This is MainThreadmain   00

Thread-1 test  1
This is MainThreadmain  1
Thread-1 test  2
This is MainThreadmain  2
This is MainThreadmain  3Thread-1 test 
 3
Thread-1 test  4
This is MainThreadmain  4

Threadオブジェクトが作成されたら、名前に値を割り当てます

thread = threading.Thread(target=test,name='aoligei')

操作の結果は次のとおりです。

aoligei test This is MainThreadmain   00

This is MainThreadmain  1
aoligei test  1
This is MainThreadmain  2
aoligei test  2
This is MainThreadmain  3
aoligei test  3
This is MainThreadmain  4
aoligei test  4

3)スレッドのライフサイクル

1.オブジェクトが作成されると、スレッドが初期化されることを意味します。2。start
()メソッドが呼び出された後、スレッドは実行を開始します。3
。スレッドコードが正常に実行されるか、例外が発生すると、スレッドは終了します。 。
Threadのis_alive()メソッドを使用して、スレッドがまだ実行されているかどうかを確認できます。is_alive()がTrueを返すと、Threadオブジェクトは正常に初期化され、start()メソッドが呼び出され、スレッドコードは引き続き正常に実行されます。

import threading
import time
def test():
    for i in range(5):
        print(threading.current_thread().name+' test ',i,"*"*10)
        time.sleep(0.5)

thread = threading.Thread(target=test,name='aoligei')
thread.start()

for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.is_alive())
    time.sleep(1)

子スレッドのスリープ時間を短く設定します。これにより、子スレッドが早く終了する可能性があります。

aoligei test MainThread main   00
 aoligei is alive ********** 
True
aoligei test  1 **********
MainThread main  1
aoligei is alive  True
aoligei test  2 **********
aoligei test  3 **********
MainThread main  2
aoligei is alive  True
aoligei test  4 **********
MainThread main  3
aoligei is alive  False
MainThread main  4
aoligei is alive  False

4)join()メソッドはブロッキング手段を提供します

import threading
import time
def test():
    for i in range(5):
        print(threading.current_thread().name+' test ',i,"*"*10)
        time.sleep(2)

thread = threading.Thread(target=test,name='aoligei')
thread.start()
thread.join()
for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.is_alive())
    time.sleep(1)

スレッドのjoin()メソッドを呼び出すと、スレッドが配置されているスレッドをブロックできます。メインスレッドがaoligeiオブジェクトを作成したら、それを開始させてから、join()メソッドを呼び出してそれを待ちます。プログラムの結果は次のとおりです。

aoligei test  0 **********
aoligei test  1 **********
aoligei test  2 **********
aoligei test  3 **********
aoligei test  4 **********
MainThread main  0
aoligei is alive  False
MainThread main  1
aoligei is alive  False
MainThread main  2
aoligei is alive  False
MainThread main  3
aoligei is alive  False
MainThread main  4
aoligei is alive  False

デフォルトでは、join()は常に対応するスレッドの終了を待ちますが、パラメーターを介して値を割り当て、指定された時間待つことができます。

def join(self.timeout=None):

timeoutは、秒単位の浮動小数点パラメーターです。

5)デーモンスレッド

import threading
import time
def test():
    for i in range(5):
        print(threading.current_thread().name+' test ',i,"*"*10)
        time.sleep(2)

thread = threading.Thread(target=test,name='aoligei')
thread.start()

for i in range(5):
    print(threading.current_thread().name+' main ', i)
    print(thread.name+' is alive ', thread.is_alive())
    time.sleep(1)

出力は次のとおりです。

aoligei test MainThread main   00 
**********aoligei is alive 
 True
MainThread main  1
aoligei is alive  True
aoligei test  1 **********
MainThread main  2
aoligei is alive  True
MainThread main  3
aoligei is alive  True
aoligei test  2 **********
MainThread main  4
aoligei is alive  True
aoligei test  3 **********
aoligei test  4 **********

MainThreadの実行が終了した後も、MainThreadは他のスレッドの終了を待機しているため、aoligeiは引き続き実行されます。
aoligeiのデーモン属性はデフォルトでFalseであるため、MainThreadは終了する前に終了を待つ必要があります。
デーモンスレッドに到達したい場合(MainThreadが終了し、子スレッドがすぐに終了します)、どうしますか?実際には非常に簡単です。子スレッドがstart()メソッドを呼び出す前にデーモンを設定するだけです。もちろん、子スレッドのコンストラクターでデーモンの値をTrueに渡すこともできます。

thread = threading.Thread(target=test,name='TestThread',daemon=True)
# thread.setDaemon(True)

変更後の実行結果は次のとおりです。

aoligei test MainThread main   00 
aoligei is alive ********** 
True
MainThread main  1
aoligei is alive  True
aoligei test  1 **********
MainThread main  2
aoligei is alive  True
MainThread main  3
aoligei is alive  True
aoligei test  2 **********
MainThread main  4
aoligei is alive  True

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

def enumerate():
“” "現在生きているすべてのスレッドオブジェクトのリストを返します。
リストには、デーモンスレッド、current_thread()によって作成されたダミースレッドオブジェクト、およびメインスレッドが含まれます。終了したスレッドとまだ開始されていないスレッドは除外されます。 。

import threading
import time
def func1():
    print("This is func1")
    time.sleep(1)
def func2():
    print("This is func2")
    time.sleep(1)

for i in range(4):
    t1=threading.Thread(target=func1)
    t2 = threading.Thread(target=func2)
    t2.start()
    t1.start()
    le=len(threading.enumerate())
    print("当前线程数为",le)

操作の結果は次のとおりです。

This is func2
This is func1当前线程数为
 3
This is func2
This is func1当前线程数为
 5
This is func2
This is func1当前线程数为
 7
This is func2
This is func1当前线程数为
 9

7)その他の方法

Threadクラスの他のメソッド
getName():スレッド名を
返しますsetName():スレッド名を設定します

スレッドモジュールによって提供されるメソッド
threading.currentThread():は、現在のスレッド変数を返します。
threading.activeCount():実行中のスレッドの数を返します。これはlen(threading.enumerate())と同じ結果になります。

2.カスタムクラスはスレッドを継承します

Threadのサブクラスをカスタマイズしてから、そのrun()メソッドをオーバーライドします

import threading
import time
class TestThread(threading.Thread):
    def __init__(self,name=None):
        threading.Thread.__init__(self,name=name)
    def run(self):
        for i in range(5):
            print(threading.current_thread().name+" test ",i)
            time.sleep(1)
thread=TestThread(name='aoligei')
thread.start()

for i in range(5):
    print(threading.current_thread().name+" main ",i)
    time.sleep(1)

TestThreadクラスをカスタマイズしてから、threading.Threadを継承しました。run()メソッドではロジックのみが処理されます。最終的な実行結果は次のとおりです。

aoligei test MainThread main   00

aoligei test MainThread main   1
1
MainThread main  2
aoligei test  2
aoligei test  3
MainThread main  3
MainThread main  4
aoligei test  4

参照リンク:Pythonマルチスレッドプログラミング(1)

おすすめ

転載: blog.csdn.net/liulanba/article/details/114434926