14のpython学習ノート - マルチスレッドのスレッド

自動テスト、テストケースとテストケース、遅く、長時間実行のよりシングルスレッドの実装を行う場合、サーバーPyhotnやストレステストにJavaを使用する場合や、単一のスレッドは、この個々のユーザーの行動をシミュレートすることしかできません私たちは、テストケース、ストレステストを実行するために、マルチスレッド、マルチプロセスを導入することができたとき。
まず、プロセスとスレッドの基本的な概念

1、プロセス:

プロセス(英語:プロセス)は、プログラムが実行されているコンピュータを指します。タスクは、プロセスであるとして、あなたは、ブラウザを開いて、理解することができ、ブラウザプロセスを開始するメモ帳を開くことであるメモ帳のプロセスを開始し、オープン2つのメモ帳は、プロセス2つのメモ帳を開始し、オープンA Wordは、プロセスWordを開始しました。プロセスは、多くのリソースの集合です。

2.スレッド

スレッド(英語:スレッド)が操作スケジューリングが可能なオペレーティングシステムの最小単位は、プロセスに含まれる具体的な作業、単位プロセスの実際の動作内部プロセスです。異なるタスクを実行するために複数のスレッドを並列に各スレッドによって複雑にすることができる方法。Wordなど、それは印刷したスレッド(スレッド)と呼ばれるこれらのプロセスにおける他のサブタスク、これらの「サブタスク」、タイピング、スペルチェックしながら行うことができます。

注:マルチスレッドマルチスレッドのpythonは、真の意味ではないが、GILグローバルインタープリタロックを使用して通訳のpython理由

GILグローバルインタープリタロック:オペレーティングシステムは、各テイクのターンが交互にタスクを実行できるようにするので、あなたは、タスクの実行を、マルチコアCPUを使用することはできませんだけで上記のCPU上で実行することができますが、プログラムを実行するとき、または一緒に実行するように見える1 0.01秒、タスク2、タスク2を行う0.01秒、およびタスク3への切り替えに切り替えが実行される繰り返しそう実行...... 0.01秒ダウン。しかし、CPUの実行速度に起因するが速すぎる、我々はすべて同じ時間に同じタスクを実行しているように、表面には、各タスクが実行され、交互、それは感じています。これは、コンテキスト・スイッチと呼ばれています。

第二に、マルチスレッドスレッド

  • Pythonは2つの標準ライブラリのスレッドとスレッド通すためのサポートを提供します。スレッドは、初心者がライン上で直接このモジュールを学び、一般的に使用される方法のいくつかをカプセル化し、低レベル、元のスレッドとモジュールを.Threading単純なロックを提供します。
  • 関数(機能)を、またはスレッドオブジェクトクラス(継承タイプ、カプセル化された)を用いてパッケージングすることが:Pythonのスレッドは、2つの方法で使用されます
  • いくつかのパラメータを導入threading.Thread:
    クラスのスレッド(_Verbose)
       
       __init__(セルフ、グループ=なし、目標=なし、名前=なし、引数=()、kwargsから=なし、冗長= なし)
           
           *グループ* :パラメータグループが空でなければならない、パラメータグループは、将来の拡張のために予約されます。
     
         ターゲットを呼び出すときに引数パラメータとkwargsからは、パラメータリストとキーワード引数を表します。
           
           *目標* :パラメータの目標は、スレッドが開始された後に実行される呼び出し可能オブジェクト(とも呼ばれるアクティブ[アクティビティ])、あります
           
           *名前*:パラメータ名は、スレッドの名前です。デフォルト値は「スレッドであるN」、N数です。
          
           *引数* :スレッド関数のターゲットに渡されたパラメータ、彼はタプル型でなければなりません。
           
           * kwargsから*:kwargsから表現キーワード引数。{}辞書タイプ。

     

図1に示すように、マルチスレッド機能

ここではマルチスレッドの簡単な関数は次のようになります。

。1  インポートスレッディング
 2  
。3  関数が実行されるように、各スレッドに定義されている
。4  DEFのdown_load(NUM):
 5      印刷' ダウンロードしたファイルを待っ%D。'NUM)
 6。 
7。 DEF 音楽():
 8      印刷" 聞きます音楽' 。9  
10は、 DEF EAT(食品、飲料):
 11      印刷' %sのを食べに、飲みS%'(食品、飲料))
 12が 
ある13  のIF  __name__ == ' __main__ " 14の     #は、スレッドグループを作成して
15件の      スレッド= []
 16の     #は、スレッドを作成T1、T2、T3 
。17      1、パラメータ通過しない関数
18である      threading.Thread =(目標=のT1 音楽)
 。19      threads.append(T1)
 20は     2、送信パラメータkwargsから
21である      threading.ThreadのT2 =(目標= EAT、kwargsから= { ' 食品'' フライドチキン'' 飲料'' コークス' })
 22である     threads.append(T2)
 23であり、     3、引数args有します。伝記タプル型(最後のパラメータは、余分なコンマを追加する「」またはそうでなければエラーになります)
24     threading.Thread = T3の(=、引数は=(1 down_loadターゲット。、))
 25      threads.append(T3)が
 26である 
27      、T2、T1の開始スレッドT3 
28      のための T のスレッド:
 29          t.start()

==== =====実行結果==================

木11月21日午後11時56分36秒2019音楽を聴く
木11月21日午後11時56分36秒2019フライドチキンを食べて、コーラ飲料
木11月21日午後11時56分36秒2019ファイルをダウンロードするための最初の待機を

図2に示すように、マルチスレッド継承

ここでは、継承されたタイプの複数のスレッドを起動する別の方法です

1 .start()メソッドは、スレッド・アクティビティを開始します。

さらに別のスレッドの各スレッドオブジェクトは、それが一度だけ呼び出されることができることであるため、それが配置されたオブジェクトの呼び出しが実行()メソッド(現在のスレッドが配置されている代わりに)。

同じスレッドオブジェクトの処理が複数回呼び出されると、それは例外RuntimeError(ランタイムエラー)をご紹介します。

2 .RUN()メソッドは、スレッド活動の方法を表します。

あなたは、サブクラスでこのメソッドをオーバーライドすることができます。標準run()メソッドの呼び出しは、Aパラメータが存在する場合、キーワードとパラメータの順序から取り出され、引数kargsされ、ターゲットオブジェクトとして調整可能なオブジェクトのコンストラクタパラメータに渡されます。
スタート()とrun()メソッドとの違い
 1 import threading,time
 2 
 3 
 4 #1.先写一个执行函数,用来实现做某件事情,不同的人在做不同的事用两个参数people,food。
 5 def cook(people,food):
 6     print('%s%s正在做%s'%(time.ctime(),people,food))
 7 
 8 
 9 #2.使用Threading模块创建线程,直接从threading.Thread继承,然后重写__init__方法和run方法
10 class MyThread(threading.Thread):#继承父类threading.Thread
11     def __init__(self,people,food,name):
12         '''重写threading.Thread初始化内容'''
13         threading.Thread.__init__(self)
14         self.threadName=name
15         self.people=people
16         self.food=food
17 
18     def run(self):  # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
19         '''重写run方法'''
20         print('开始线程:'+self.threadName)
21 
22         cook(self.people,self.food) #执行任务
23         print('等待中\n')
24         print('结束线程'+self.name)
25 
26 if __name__ == '__main__':
27     #创建新线程,并将线程添加到线程组
28     threads=[]
29     t1=MyThread('小米','红烧鱼','thread-1')
30     threads.append(t1)
31     t2=MyThread('小明','水煮牛肉','thread-2')
32     threads.append(t2)
33     t3=MyThread('小美','佛跳墙','thread-3')
34     threads.append(t3)
35 
36     #启动线程
37     for t in threads:
38         t.start()
39 
40     print(time.sleep(1))
41     print('退出主线程')

==============执行结果==============

开始线程:thread-1
Fri Nov 22 00:31:37 2019小米正在做红烧鱼
开始线程:thread-2
等待中

Fri Nov 22 00:31:37 2019小明正在做水煮牛肉
开始线程:thread-3
Fri Nov 22 00:31:37 2019小美正在做佛跳墙
等待中

结束线程Thread-3
退出主线程
结束线程Thread-1
等待中

结束线程Thread-2

从以上执行结果看,主线程已退出,子线程Thread-1和Thread-2还在运行,这就需要用到后面讲的等待线程和守护线程了

 

おすすめ

転載: www.cnblogs.com/cocomoly/p/11909390.html