PythonマルチスレッドThreading(一)


くだらないことが好きではありません.まず今日のコードに行きます.
#-*- coding:utf-8 -*-
import threading
class MyThreading(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self)
        self.num  =  num
    def run(self):
        print self.num
        
        
t = MyThreading(100)
t.start()
print t.isAlive()

一見、簡単なthreadingコードです.まずThreadクラスを継承し,サブクラスで初期化してrunメソッドを書き換えた.最後にMyThreadingサブクラスをインスタンス化し、numパラメータを印刷します.最後にスレッド実行状態を印刷します.
初心者は見ると、numパラメータを先に印刷してからスレッド状態を印刷するというサポートが絶対2派に分かれています.2、胸をたたいてスレッド状態を印刷してからnumパラメータを印刷することを保証する.
 
実は結果は予想されていました.
結果1:
C:\Python27\python.exe D:/ProjectSpace/thread-example.py
100True
Process finished with exit code 0

 
結果2:
C:\Python27\python.exe D:/ProjectSpace/thread-example.py
True100
Process finished with exit code 0

 
 
驚いた?1回の実行結果は何回か同じになるかもしれませんが、10回の実行では少なくとも1~4回の異なる結果が得られます.
 
答え:スレッドの実行は無秩序になります
 
上の質問を持って、次の例を見てみましょう.
 
#-*- coding:utf-8 -*-
import threading,time
class MyThreading(threading.Thread):
    def __init__(self,num):
        threading.Thread.__init__(self)
        self.num  =  num
    def run(self):
        time.sleep(10)
        print self.num
        
def function1():
    t1.start()
    time.sleep(1)
    print "t1 thread was Destruction "
    
def function2():
    t2.start()
    time.sleep(1)
    print "t2 thread was Destruction "
    
    
t1 = MyThreading(10)
t2 = MyThreading(20)
t2.setDaemon(True)
function1()
function2()

 
コードを複数回実行すると、次のような結果が得られます.
C:\Python27\python.exe D:/ProjectSpace/thread-example.py
t1 thread was Destruction 
t2 thread was Destruction 
10
Process finished with exit code 0

 
単一ステップデバッグの実行結果を見てみましょう.
C:\Python27\python.exe "C:\Program Files (x86)\JetBrains\PyCharm 5.0.3\helpers\pydev\pydevd.py" --multiproc --qt-support --client 127.0.0.1 --port 62267 --file D:/ProjectSpace/thread-example.py
Connected to pydev debugger (build 143.1559)
10
t1 thread was Destruction 
20
t2 thread was Destruction
Process finished with exit code 0

 
はい、あなたは間違っていません!結果が異なる理由は次のとおりです.
Threadclass.setDeamonメソッドは、スレッドのプライマリスレッドを指定します.プライマリ・スレッドは、サブプロセスが完了しているかどうかを確認し、完了していない場合は待機し続け、完了している場合は終了します.
 
これも、Debugモードでは論理的な方法を実行していますが、実際には実行時の結果は上記のようになっています.
 
では、問題が来ました.プログラムの順序をどのように保証しますか?
 
スレッドの実行順序を保証するために,あるいは一貫性を保証するために,スレッドの動作に対して同期の概念を導入した.同期に最適な方法は、操作をロックすることです.(鍵をかけてMySQLの鍵を思い出しましたー_-)
次の2つの例を引き続き見てください.
 
例1:
#-*- coding:utf-8 -*-
import threading,time
####  Thread 
class MyThreading(threading.Thread):
    def __init__(self,name):
        ####     
        threading.Thread.__init__(self,name=name)
    def run(self):
        ####      
        global x
        ####     
        lock.acquire()
        for i in range(3):
            x = x + 1
        time.sleep(3)
        print x
        ####       
        lock.release()
####        
lock = threading.RLock()
####            
tl = []
####   10  ,       tl      
for i in range(10):
    t = MyThreading(str(i))
    tl.append(t)
####     
x = 0
####              
for i in tl:
    i.start()

出力結果は以下の通りです.
C:\Python27\python.exe D:/ProjectSpace/thread-example.py
3
6
9
12
15
18
21
24
27
30
Process finished with exit code 0

 
コードは簡単で、まず1つのループで10個のクラスを1つのリストにインスタンス化し、リストからループして実行します.このステップは、ロックが実行されているため、解放されます.time.sleep()時間以内にreleaseは実行できません.プログラムの順序を制御することができます
 
例2:
#-*- coding:utf-8 -*-
import threading,time
####  Thread 
class MyThreading(threading.Thread):
    def __init__(self,name):
        ####     
        threading.Thread.__init__(self,name=name)
    def run(self):
        ####      
        global x
        ####     
        #lock.acquire()
        for i in range(3):
            x = x + 1
        time.sleep(3)
        print x
        ####      
        #lock.release()
####        
#lock = threading.RLock()
####            
tl = []
####   10  ,       tl      
for i in range(10):
    t = MyThreading(str(i))
    tl.append(t)
####     
x = 0
####              
for i in tl:
    i.start()

出力結果は以下の通りです.
C:\Python27\python.exe D:/ProjectSpace/thread-example.py
30
30
30
30
30
30
30
30
30
30
Process finished with exit code 0

 
例1と同様に、プログラムはリストからインスタンス化されたクラスを取り出して実行する.しかしrunメソッドをロックしていないため、スレッドはtimeに実行する.sleep()は待たずに2番目を起動します....3番目...最後まで.
runメソッドがすべて実行すると、グローバル変数Xの最終値timeが算出される.sleep時間です.このときXは30になっているので、X出力あたりの値は30になります.
 
簡単なThreading関数の同期例はここまでです!また今度ね~~~(—3—)