多线程 全局变量_python高级:6.多线程part1
0.前言
如果可以的話,請先關注(專欄和賬號),然后點贊和收藏,最后學習和進步。你的支持是我繼續寫下去的最大動力,個人定當傾囊而送,不負眾望。謝謝!!!
1.前提
基于win10專業版64位系統+64位jdk1.8+64位python3.6.5+社區版pycharm2018.1.3+unittest+selenium3.141.0。
要學好自動化測試,我們先從python語言基礎開始學習,一步一個腳印,欲速則不達哦!
2.線程和進程
1)簡介
線程:有時被稱為輕量級進程(Lightweight Process,LWP),是操作系統調度(CPU調度)執行的最小單位。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。
多線程類似于同時執行多個不同程序,多線程運行有如下優點:
a.使用線程可以把占據長時間的程序中的任務放到后臺去處理;
b.用戶界面可以更加吸引人,這樣比如用戶點擊了一個按鈕去觸發某些事件的處理,可以彈出一個進度條來顯示處理的進度;
c.程序的運行速度可能加快。
進程:運行起來的程序。進程需要占用系統資源(內存,CPU)。進程是最小的系統資源分配單位,只是給線程提供執行環境。
注:一個進程可以包含一到多個線程,進程獨享資源,進程包含的線程間共享該進程資源。比如啟動一個QQ對應一個進程,你打開多個聊天窗口與不同人聊天用的就是線程,不同聊天窗口線程之間互不影響,同時共享QQ進程的資源。
這些游戲相信很多人都玩過,里面都是真實的玩家,在你的客戶端電腦上啟動游戲對應游戲里面的一個玩家角色,對于客戶端電腦來說你是一個進程,但對于服務器來說你是一個線程,每個玩家都是線程,所以玩家之間才不會相互影響。
2)基礎語法
僅以線程為例:進程語法類似。
from threading import Thread#線程模塊導包 from multiprocessing import Process#進程模塊導包t1 = Thread(target=method)#創建線程 t1.setDaemon(True)#守護線程:與jion()相反,不等子線程完成繼續執行后面的任務,與主線程一起結束 t1.start()#啟動線程 t1.join()#等待線程:主線程必須等待對應子線程結束才能繼續往下執行注:程序運行的時候,代碼從上到下從左到右這種運行邏輯就對應進程的主線程(一個進程至少得有一個主線程程),在這個過程中如果遇到定義的其它線程,這些其它線程就叫做子線程。
3)實例
等待線程:
from time import sleep from threading import Thread def method(n):for i in range(1,n+1):print(i)sleep(1) # 為了使后面線程并發時交叉效果更明顯,故添加個等待 if __name__ == '__main__':t1 = Thread(target=method,args=(5,))t1.start()t1.join()#等待線程,主線程到達這里必須等待子線程t1完成才會繼續往下執行print("game over!") # 運行結果: 1 2 3 4 5 game over!說明:game voer!的打印必須前面的t1線程運行完了才能執行,結果可見上方。
守護線程:
from time import sleep from threading import Thread def method(n):for i in range(1,n+1):print(i)sleep(1) # 為了使后面線程并發時交叉效果更明顯,故添加個等待 if __name__ == '__main__':t1 = Thread(target=method,args=(5,))t1.setDaemon(True)#守護線程,主線程到達這里無需等待子線程t1完成,直接繼續往下執行,主線程結束,對應的守護子線程跟著一起結束t1.start()print("game over!")說明:game voer!的打印無需等待前面的t1線程運行完成,直接繼續往下,主線程完了,對應的守護子線程跟著一起結束,結果可見上方。
不使用線程打印兩遍1~5:
from time import sleep def method(n):for i in range(1,n+1):print(i)sleep(1)#為了使后面線程并發時交叉效果更明顯,故添加個等待 if __name__ == '__main__':method(5)method(5) #運行結果: 1 2 3 4 5 1 2 3 4 5使用兩個線程分別打印一遍1~5:
from time import sleep from threading import Thread def method(n):for i in range(1,n+1):print(i)sleep(1)#為了使后面線程并發時交叉效果更明顯,故添加個等待 if __name__ == '__main__':t1 = Thread(target=method,args=(5,))t1.start()t2 = Thread(target=method,args=(5,))t2.start() #運行結果: 1 1 2 2 3 3 4 4 5 5總結:從以上兩端代碼得出結論,線程可以并發執行。
分別用進程和線程來操作同一個變量,看下結果:
from threading import Thread a = 1 def method():global aa += 1print('函數內部',a) if __name__ == '__main__':t1 = Thread(target=method)#創建一個調用method方法的子線程t1t1.start()#啟動t1線程,實質是給全局變量a加了1,變為2print('函數外部',a)t2 = Thread(target=method)#創建一個調用method方法的子線程t2t2.start()#啟動t2線程,實質是又給全局變量a加了1,變為3print('函數外部',a) # 運行結果: 函數內部 2 函數外部 2 函數內部 3 函數外部 3from multiprocessing import Process a = 1 def method():global aa += 1print('函數內部',a) if __name__ == '__main__':p1 = Process(target=method)#創建一個調用method方法的進程p1p1.start()#啟動p1進程,實質是給全局變量a加了1,變為2print('函數外部',a)p2 = Process(target=method)#創建一個調用method方法的進程p2p2.start()#啟動p2進程,實質是又給全局變量a加了1,變為3print('函數外部',a) # 運行結果: 函數外部 1 函數外部 1 函數內部 2 函數內部 2總結:以上結果能能說明什么呢?說明進程間獨享資源(包括變量對象),線程間共享資源(包括變量對象的計算結果)。
總結
以上是生活随笔為你收集整理的多线程 全局变量_python高级:6.多线程part1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 远程登录linux_linux 检查远程
- 下一篇: excel修改列名 pandas_P9: