資訊內容
深入理解上篇之 Python的進程和線程
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
進程(Process)和線程(Thread)都是操作系統中的基本概念,它們之間有一些優劣和差異,那么在Python中如何使用進程和線程?uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
CPU計算機的核心是CPU,它承擔了計算機的所有計算任務,CPU就像一個工廠,時刻在運行著,而操作系統管理著計算機,負責任務的調度、資源的分配和管理。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
進程進程是指在系統中能獨立運行并作為資源分配的基本單位,它是由一組機器指令、數據和堆棧等組成的,是一個能獨立運行的活動實體。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
我們打開我們的計算機就會看到進程和線程,點擊我的電腦就可以看到CPU的運算。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
從如圖中,CPU一共運行著190個進程,2620個線程。比如,當我們再次點擊QQ,登陸另一個賬號的時候又會開啟另一個QQ進程。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
因此,如果想在電腦登入多個微信。只需要找到你的微信快捷方式,單擊右鍵查看屬性,在目標中復制鏈接;新建一個記事本,隨便取個名字,雙擊打開后,在其中輸入 start ""(注意引號為英文狀態,且前后有空格),將剛剛復制的鏈接(也就是微信安裝的路徑)粘貼進去;然后復制整行,想開幾個微信就粘貼幾行;保存文件,更改后綴名為 bat。雙擊運行即可。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
線程(Thread)也叫輕量級進程,是操作系統能夠進行運算調度的**小單位,它被包涵在進程之中,是進程中的實際運作單位。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
記得阮一峰寫過的博客:假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間都必須停工。背后的含義就是,單個CPU一次只能運行一個任務。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
進程就好比工廠的車間,它代表CPU所能處理的單個任務。任一時刻,CPU總是運行一個進程,其他進程處于非運行狀態。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
線程就好比車間里的工人。一個進程可以包括多個線程,協同完成一個任務。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
總結來說:程序可以包含多個進程,多個進程并發執行,相互獨立,因此,進程也是系統進行資源分配和調度基本單位。專業化來說:進程是指程序執行時的一個實例。線程是**小的執行單元,而進程由至少一個線程組成。如何調度進程和線程,完全由操作系統決定。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
在Python中線程和進程的使用現在講下在Python線程和進程的使用。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
在Python中,通過兩個標準庫 thread和 Threading提供對線程的支持,threading對 thread進行了封裝。threading模塊中提供了 Thread,Lock, RLOCK, Condition等組件uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
Thread在Python中線程和進程的使用就是通過Thread這個類。這個類在我們的_thread和threading模塊中。我們一般通過threading導入。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
默認情況下,只要在解釋器中,如果沒有報錯,則說明線程可用。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
>> from threading import Thread復制代碼下面是Thread類的常用參數說明和實例方法。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
我們看一個*方文檔中標準的多線程的例子。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
import threading import time # 定義線程要運行的函數 def func(name): # 為了便于觀察,睡眠2秒 time.sleep(2) print("My name is %s " % name) # 創建第一個線程的實例,args參數是一個元組,后面必須加逗號分隔 t1 = threading.Thread(target=func, args=("Runsen",)) # 創建第二個線程的實例 t2 = threading.Thread(target=func, args=("Maoli",)) t1.start() t2.start() # 先打印線程名 print(t1.getName()) print(t2.getName())復制代碼由于兩個線程是同時運行的,所以print打印處理的結果并沒有換行。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
下面我寫了下面的代碼,加深threading模塊的使用。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
# -*- coding:utf-8 -*-# time :2019/4/9 21:52# author: Runsenimport threadingimport timedef fun1(): print('hello') time.sleep(2) print('Bye')def fun2(): print('hi') time.sleep(2) print('OUT') t1 = threading.Thread(target=fun1) t2 = threading.Thread(target=fun2) t1.start() t2.start()# t1.join()# t2.join()print('主線程完畢')復制代碼下面是輸出結果。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
hello hi 主線程完畢 Bye OUT復制代碼我們先不加join()來阻塞,t1和t2兩個線程同時執行,由于位置關系先打印hello,再打印hi,這個時候都sleep2秒鐘,但是它sleep2秒鐘,主程序還是在執行,所以下面打印print('主線程完畢'),**后才打印Bye和OUT。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
線程間變量的共享在多線程中,所有變量對于所有線程都是共享的,因此,線程之間共享數據的**大危險在于多個線程同時修改一個變量,那就亂套了,所以我們需要互斥鎖,來鎖住數據。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
代碼如上圖所示,上面代碼中打印的a是1還是2?uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
答案是:2。因為出現了global關鍵字,線程間變量的共享,在func函數中的a是全局變量。因此在函數中a的值發生了變化。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
下面,我們提高一點點難度,代碼如下圖所示,還是猜一猜a是啥東西。注意:這里出現了join來阻塞,并且增加了加和減的操作。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
相信很多人都認為是0,其實這個a的值是變化的,可能這次是0 ,下次是1,還有可能是1000000,比如,我可以uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
a就是在[-1000000,1000000]中的一個隨機數。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
為什么呢?這是因為雖然他們是同時運行的,但是同時在修改我們的a,那就亂了。a在for i in range(1000000),就是遍歷了1000000,incr和decr的方法都加上一起了,在這1000000次遍歷中,不知道有多少加,多少減,比如,我1000000都是加,沒有減,a就是1000000,但是這種情況的概率很低。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
如果你就是想出現0,其實只需要加一個互斥鎖就可以了。這樣你加多少次,我就減多少次,加減的次數不會疊加。因此來了lock的用法,具體代碼如下圖所示。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
這個a怎么運行都是 0。因為我們把這個a鎖上了,這樣就加1000000次,減1000000次,怎么出來都是我們的0。uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
相關免費學習推薦:python視頻教程uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺
以上就是深入理解上篇之 Python的進程和線程的詳細內容,更多請關注少兒編程網其它相關文章!uHu少兒編程網-Scratch_Python_教程_免費兒童編程學習平臺

- 上一篇
python中怎么安裝插件
簡介python中安裝第三方插件的方法:1、聯網方式,最簡單是直接執行命令:pipinstallxxx2、離線方式 1)下載包windows下找包:https://www.lfd.uci.edu/~gohlke/pythonlibs/unix下找包(要找哪個包就將后面的pandas換成對應的包
- 下一篇
python和php學哪個做web開發好
簡介不少打算學編程的學生,想從事web開發行業,但是對于web開發是選擇python還是php語言比較糾結,不知道選擇哪個編程語言好。先看兩者開發方向區別python主要應用領域是人工智能和大數據挖掘php目前市場長大部份網站主要開發語言可見目前web開發主要是php占的份額較大,python更多的是用