python之系統編程 --線程
阿新 • • 發佈:2017-10-30
加鎖 如果 ima -i 沒有 %d div img ges
###########使用線程完成多任務################
from threading import Thread import time #1. 如果多個線程執行的都是同一個函數的話,各自之間不會有影響,各是個的 def test(): print("----昨晚喝多了,下次少喝點---") time.sleep(1) for i in range(5): t = Thread(target=test) t.start()
#############使用類的方式創建線程完成任務###########
import threadingimport time class MyThread(threading.Thread): def run(self): for i in range(3): time.sleep(1) msg = "I‘m "+self.name+‘ @ ‘+str(i) #name屬性中保存的是當前線程的名字 print(msg) if __name__ == ‘__main__‘: t = MyThread() t.start()
執行結果:
[root@master process]#python3 09-thread.py I‘m Thread-1 @ 0 I‘m Thread-1 @ 1 I‘m Thread-1 @ 2
###############線程之間共享全局變量#########
from threading import Thread import time #線程之間共享全局變量 g_num = 100 def work1(): global g_num for i in range(3): g_num += 1 print("----in work1, g_num is %d---"%g_num) defwork2(): global g_num print("----in work2, g_num is %d---"%g_num) print("---線程創建之前g_num is %d---"%g_num) t1 = Thread(target=work1) t1.start() #延時一會,保證t1線程中的事情做完 time.sleep(1) t2 = Thread(target=work2) t2.start()
############線程之間共享全局變量帶來的問題############
from threading import Thread import time g_num = 0 def test1(): global g_num for i in range(1000000): g_num += 1 print("---test1---g_num=%d"%g_num) def test2(): global g_num for i in range(1000000): g_num += 1 print("---test2---g_num=%d"%g_num) p1 = Thread(target=test1) p1.start() #time.sleep(3) #取消屏蔽之後 再次運行程序,結果會不一樣,,,為啥呢? p2 = Thread(target=test2) p2.start() print("---g_num=%d---"%g_num)
############把列表當做參數傳遞給線程############
from threading import Thread import time def work1(nums): nums.append(44) print("----in work1---",nums) def work2(nums): #延時一會,保證t1線程中的事情做完 time.sleep(1) print("----in work2---",nums) g_nums = [11,22,33] t1 = Thread(target=work1, args=(g_nums,)) t1.start() t2 = Thread(target=work2, args=(g_nums,)) t2.start()
###############避免多線程對共享數據出錯的方式###########
from threading import Thread import time g_num = 0 g_flag = 1 def test1(): global g_num global g_flag if g_flag == 1: for i in range(1000000): g_num += 1 g_flag = 0 print("---test1---g_num=%d"%g_num) def test2(): global g_num #輪詢 while True: if g_flag != 1: for i in range(1000000): g_num += 1 break print("---test2---g_num=%d"%g_num) p1 = Thread(target=test1) p1.start() #time.sleep(3) #取消屏蔽之後 再次運行程序,結果會不一樣,,,為啥呢? p2 = Thread(target=test2) p2.start() print("---g_num=%d---"%g_num)
##############使用互斥鎖解決共享數據出錯問題##################
代碼例子:
from threading import Thread, Lock import time g_num = 0 def test1(): global g_num #這個線程和test2線程都在搶著 對這個鎖 進行上鎖,如果有1方成功的上鎖,那麽導致另外 #一方會堵塞(一直等待)到這個鎖被解開為止 mutex.acquire() for i in range(1000000): g_num += 1 mutex.release()#用來對mutex指向的這個鎖 進行解鎖,,,只要開了鎖,那麽接下來會讓所有因為 #這個鎖 被上了鎖 而堵塞的線程 進行搶著上鎖 print("---test1---g_num=%d"%g_num) def test2(): global g_num mutex.acquire() for i in range(1000000): g_num += 1 mutex.release() print("---test2---g_num=%d"%g_num) #創建一把互斥鎖,這個鎖默認是沒有上鎖的 mutex = Lock() p1 = Thread(target=test1) p1.start() #time.sleep(3) #取消屏蔽之後 再次運行程序,結果會不一樣,,,為啥呢? p2 = Thread(target=test2) p2.start() print("---g_num=%d---"%g_num)
#############多線程使用非共享變量################
from threading import Thread import threading import time def test1(): #註意: # 1. 全局變量在多個線程中 共享,為了保證正確運行需要鎖 # 2. 非全局變量在每個線程中 各有一份,不會共享,當然了不需要加鎖 name = threading.current_thread().name print("----thread name is %s ----"%name) g_num = 100 if name == "Thread-1": g_num += 1 else: time.sleep(2) print("--thread is %s----g_num=%d"%(name,g_num)) #def test2(): # time.sleep(1) # g_num = 100 # print("---test2---g_num=%d"%g_num) p1 = Thread(target=test1) p1.start() p2 = Thread(target=test1) p2.start()
執行結果:
###################同步#################
python之系統編程 --線程