溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python的進程和線程分別是什么意思

發(fā)布時間:2020-11-18 11:06:20 來源:億速云 閱讀:381 作者:小新 欄目:編程語言

小編給大家分享一下Python的進程和線程分別是什么意思,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

進程(Process)和線程(Thread)都是操作系統(tǒng)中的基本概念,它們之間有一些優(yōu)劣和差異,那么在Python中如何使用進程和線程?

CPU

計算機的核心是CPU,它承擔(dān)了計算機的所有計算任務(wù),CPU就像一個工廠,時刻在運行著,而操作系統(tǒng)管理著計算機,負責(zé)任務(wù)的調(diào)度、資源的分配和管理。

進程

進程是指在系統(tǒng)中能獨立運行并作為資源分配的基本單位,它是由一組機器指令、數(shù)據(jù)和堆棧等組成的,是一個能獨立運行的活動實體。

我們打開我們的計算機就會看到進程和線程,點擊我的電腦就可以看到CPU的運算。

Python的進程和線程分別是什么意思

從如圖中,CPU一共運行著190個進程,2620個線程。比如,當(dāng)我們再次點擊QQ,登陸另一個賬號的時候又會開啟另一個QQ進程。

因此,如果想在電腦登入多個微信。只需要找到你的微信快捷方式,單擊右鍵查看屬性,在目標(biāo)中復(fù)制鏈接;新建一個記事本,隨便取個名字,雙擊打開后,在其中輸入 start ""(注意引號為英文狀態(tài),且前后有空格),將剛剛復(fù)制的鏈接(也就是微信安裝的路徑)粘貼進去;然后復(fù)制整行,想開幾個微信就粘貼幾行;保存文件,更改后綴名為 bat。雙擊運行即可。

Python的進程和線程分別是什么意思

線程

線程(Thread)也叫輕量級進程,是操作系統(tǒng)能夠進行運算調(diào)度的最小單位,它被包涵在進程之中,是進程中的實際運作單位。

記得阮一峰寫過的博客:假定工廠的電力有限,一次只能供給一個車間使用。也就是說,一個車間開工的時候,其他車間都必須停工。背后的含義就是,單個CPU一次只能運行一個任務(wù)。

Python的進程和線程分別是什么意思

進程就好比工廠的車間,它代表CPU所能處理的單個任務(wù)。任一時刻,CPU總是運行一個進程,其他進程處于非運行狀態(tài)。

線程就好比車間里的工人。一個進程可以包括多個線程,協(xié)同完成一個任務(wù)。

總結(jié)來說:程序可以包含多個進程,多個進程并發(fā)執(zhí)行,相互獨立,因此,進程也是系統(tǒng)進行資源分配和調(diào)度基本單位。專業(yè)化來說:進程是指程序執(zhí)行時的一個實例。線程是最小的執(zhí)行單元,而進程由至少一個線程組成。如何調(diào)度進程和線程,完全由操作系統(tǒng)決定。

在Python中線程和進程的使用

現(xiàn)在講下在Python線程和進程的使用。

在Python中,通過兩個標(biāo)準(zhǔn)庫 threadThreading提供對線程的支持,threadingthread進行了封裝。threading模塊中提供了 Thread,Lock, RLOCK, Condition等組件

Thread

在Python中線程和進程的使用就是通過Thread這個類。這個類在我們的_threadthreading模塊中。我們一般通過threading導(dǎo)入。

默認情況下,只要在解釋器中,如果沒有報錯,則說明線程可用。

>> from threading import Thread復(fù)制代碼

下面是Thread類的常用參數(shù)說明和實例方法。

Python的進程和線程分別是什么意思

Python的進程和線程分別是什么意思

我們看一個官方文檔中標(biāo)準(zhǔn)的多線程的例子。

import threading
import time
# 定義線程要運行的函數(shù)
def func(name):
    # 為了便于觀察,睡眠2秒
    time.sleep(2)
    print("My name is %s\t" % name)

# 創(chuàng)建第一個線程的實例,args參數(shù)是一個元組,后面必須加逗號分隔
t1 = threading.Thread(target=func, args=("Runsen",))
# 創(chuàng)建第二個線程的實例
t2 = threading.Thread(target=func, args=("Maoli",))
t1.start()
t2.start()
# 先打印線程名 
print(t1.getName())
print(t2.getName())復(fù)制代碼

由于兩個線程是同時運行的,所以print打印處理的結(jié)果并沒有換行。

Python的進程和線程分別是什么意思

下面我寫了下面的代碼,加深threading模塊的使用。

# -*- 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('主線程完畢')復(fù)制代碼

下面是輸出結(jié)果。

hello
hi
主線程完畢
Bye
OUT復(fù)制代碼

我們先不加join()來阻塞,t1t2兩個線程同時執(zhí)行,由于位置關(guān)系先打印hello,再打印hi,這個時候都sleep2秒鐘,但是它sleep2秒鐘,主程序還是在執(zhí)行,所以下面打印print('主線程完畢'),最后才打印ByeOUT。

線程間變量的共享

在多線程中,所有變量對于所有線程都是共享的,因此,線程之間共享數(shù)據(jù)的最大危險在于多個線程同時修改一個變量,那就亂套了,所以我們需要互斥鎖,來鎖住數(shù)據(jù)。

Python的進程和線程分別是什么意思

代碼如上圖所示,上面代碼中打印的a是1還是2?

答案是:2。因為出現(xiàn)了global關(guān)鍵字,線程間變量的共享,在func函數(shù)中的a是全局變量。因此在函數(shù)中a的值發(fā)生了變化。

下面,我們提高一點點難度,代碼如下圖所示,還是猜一猜a是啥東西。注意:這里出現(xiàn)了join來阻塞,并且增加了加和減的操作。

Python的進程和線程分別是什么意思

相信很多人都認為是0,其實這個a的值是變化的,可能這次是0 ,下次是1,還有可能是1000000,比如,我可以

a就是在[-1000000,1000000]中的一個隨機數(shù)。

為什么呢?這是因為雖然他們是同時運行的,但是同時在修改我們的a,那就亂了。a在for i in range(1000000),就是遍歷了1000000,incrdecr的方法都加上一起了,在這1000000次遍歷中,不知道有多少加,多少減,比如,我1000000都是加,沒有減,a就是1000000,但是這種情況的概率很低。

如果你就是想出現(xiàn)0,其實只需要加一個互斥鎖就可以了。這樣你加多少次,我就減多少次,加減的次數(shù)不會疊加。因此來了lock的用法,具體代碼如下圖所示。

Python的進程和線程分別是什么意思

這個a怎么運行都是 0。因為我們把這個a鎖上了,這樣就加1000000次,減1000000次,怎么出來都是我們的0。

看完了這篇文章,相信你對Python的進程和線程分別是什么意思有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI