導航:首頁 > 編程語言 > python線程

python線程

發布時間:2022-01-18 11:16:20

python中什麼是線程

線程是系統中的名詞,Python一般是單線程的,Python的多線程優化很差。
線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以並發執行。由於線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。就緒狀態是指線程具備運行的所有條件,邏輯上可以運行,在等待處理機;運行狀態是指線程佔有處理機正在運行;阻塞狀態是指線程在等待一個事件(如某個信號量),邏輯上不可執行。每一個程序都至少有一個線程,若程序只有一個線程,那就是程序本身。
線程是程序中一個單一的順序控制流程。進程內有一個相對獨立的、可調度的執行單元,是系統獨立調度和分派CPU的基本單位指令運行時的程序的調度單位。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。

② 為什麼有人說 Python 的多線程是雞肋

因為 Python 中臭名昭著的 GIL。

那麼 GIL 是什麼?為什麼會有 GIL?多線程真的是雞肋嗎? GIL 可以去掉嗎?帶著這些問題,我們一起往下看,同時需要你有一點點耐心。

多線程是不是雞肋,我們先做個實驗,實驗非常簡單,就是將數字 「1億」 遞減,減到 0 程序就終止,這個任務如果我們使用單線程來執行,完成時間會是多少?使用多線程又會是多少?show me the code

那麼把 GIL 去掉可行嗎?

還真有人這么干多,但是結果令人失望,在1999年Greg Stein 和Mark Hammond 兩位哥們就創建了一個去掉 GIL 的 Python 分支,在所有可變數據結構上把 GIL 替換為更為細粒度的鎖。然而,做過了基準測試之後,去掉GIL的 Python 在單線程條件下執行效率將近慢了2倍。

Python之父表示:基於以上的考慮,去掉GIL沒有太大的價值而不必花太多精力。

③ Python中如何在代碼中主動開啟線程

首先先定義線程,然後對象.start(),如果是線程池先定義線程池,給線程池分配任務他就運行了

④ Python 線程初始化

__init__函數是service類的初始化函數
這個函數中參數server_ip,server_port沒有默認值,初始化service類實例時必須給這兩個參數傳值
上面的代碼除了定義__init__函數體外,沒有任何其它的代碼,不知道在那裡初始了service類實例
如果你指的是threading.Thread.__init__(self)語句的話,這是調用父類的初始化方法

⑤ python 怎麼實現多線程的

線程也就是輕量級的進程,多線程允許一次執行多個線程,Python是多線程語言,它有一個多線程包,GIL也就是全局解釋器鎖,以確保一次執行單個線程,一個線程保存GIL並在將其傳遞給下一個線程之前執行一些操作,也就產生了並行執行的錯覺。

⑥ 如何進行Python主線程設置

輸入模塊可以使用其功能的其他程序。這就是為什麼我們使用Python標准庫的方法
輸入:。
#的/ usr / bin中/ env的蟒蛇
#文件名:! Using_sys.py

進口SYS

列印「命令行參數是:」
因為我在sys.argv中:
我列印網上列印「\ \ n此PYTHONPATH是',sys.path中,'\ N'

輸出:
$蟒蛇using_sys.py我們
參數的命令行參數:
using_sys
的.py我們

參數
登錄到到網PYTHONPATH為['/家庭/ swaroop /位元組/碼','/usr/lib/python23.zip「, BR>'/usr/lib/python2.3','/ usr / lib目錄/ python2.3 /開發平台,將linux2「,
」/usr/lib/python2.3/lib-tk','的/ usr /的lib / python2.3 / lib目錄-dynload「,
'的/ usr /lib/python2.3/site-packages','/usr/lib/python2.3/site-packages/gtk-2.0']

首先,我們使用import語句輸入sys模塊。基本上,這句話語句告訴Python中,我們要使用這個模塊。 sys模塊包含了與Python解釋器及其環境相關的功能。

當執行Python導入SYS語句,它被列在目錄中找到的sys.path變數sys.py模塊。如果您發現該文件,該模塊中的報表的主塊將被運行,然後這個你要使用的模塊。注意,在初始化過程只是我們第一次進行的輸入模塊。此外,「SYS」是「系統」的縮寫。通過使用點

sys模塊的argv變數表示--sys.argv--這種方法的一個優點是名稱不與你的程序中使用任何argv變數沖突。此外,還清楚地表明,該名稱是sys模塊的一部分。

sys.argv中的變數是一個字元串(列表中會詳細在後面的章節介紹)的列表。特別是,sys.argv中包含的命令行參數,即利用傳遞給你的程序的命令行參數的清單。

如果使用IDE來編寫和執行這些程序,請認準的命令行參數菜單的方法指定的程序。

在這里,當我們執行Python using_sys.py我們有觀點,我們使用Python命令來運行using_sys.py模塊,然後作為參數傳遞給程序的內容。 Python的,我們把它存儲在sys.argv變數。

記住,第一個參數始終是劇本sys.argv列表,它的名稱。所以,在這里,「using_sys.py」是sys.argv中[0],'我們'是sys.argv中[1],'是'是sys.argv中[2]和「論據」是sys.argv中[3]。注意,Python的從0開始計數,而不是從頭開始。

sys.path中包含的目錄名輸入模塊的列表。我們可以觀察到sys.path的第一個字元串是空的 - 這部分在當前目錄下的空字元串表示形式是sys.path中,這PYTHONPATH環境變數是相同的。這意味著,你可以直接在當前目錄下輸入模塊。否則,你必須把你的模塊在sys.path所列的目錄之一。

⑦ python 怎麼殺死指定線程名的線程

這幾天在實踐的時候,有一個問題一直在困擾我,比如timer,定時器,Python沒有這么好的機制,需要自己實現。這個網上也是有一些。但是我自己的需求可能並不一樣。

需求:
我需要一個函數工作,比如遠程連接一個埠,遠程讀取文件等,但是我給的時間有限,比如,4秒鍾如果你還沒有讀取完成或者連接成功,我就不等了,很可能對方已經宕機或者拒絕了。這樣可以批量做一些事情而不需要一直等,浪費時間。
定時器是最好的,我覺得這個需求,一旦定時過了,就將這個讀取函數直接kill。但是這出現了問題。
第一,怎麼定時?
第二,時間到了,怎麼kill函數
第三,定時函數和kill函數怎麼判斷該kill了。
寫一個多線程,一個線程專門用來計時間,一個用來執行函數,一旦時間到了,就殺死執行函數的線程。我在多線程,python很弱,似乎沒有這樣的比較簡單的一個介面就調用的。不像windows編程。那麼,該怎辦?

結合我的需求,我這么做:
1、在主進程執行,調用一個進程執行函數,然後主進程sleep,等時間到了,就kill 執行函數的進程。
測試一個例子:

[python] view plain
import time
import threading

def p(i):
print i

class task(threading.Thread):
def __init__(self,fun,i):
threading.Thread.__init__(self)
self.fun = fun
self.i = i
self.thread_stop = False

def run(self):
while not self.thread_stop:
self.fun(self.i)

def stop(self):
self.thread_stop = True

def test():
thread1 = task(p,2)
thread1.start()
time.sleep(4)
thread1.stop()

⑧ Python多線程是什麼意思

多線程能讓你像運行一個獨立的程序一樣運行一段長代碼。這有點像調用子進程(subprocess),不過區別是你調用shu的是一個函數或者一個類,而不是獨立的程序。
程基本上是一個獨立執行流程。單個進程可以由多個線程組成。程序中的每個線程都執行特定的任務。例如,當你在電腦上玩游戲時,比如說國際足聯,整個游戲是一個單一的過程。,但它由幾個線程組成,負責播放音樂、接收用戶的輸入、同步運行對手等。所有這些都是單獨的線程,負責在同一個程序中執行這些不同的任務。
每個進程都有一個始終在運行的線程。這是主線。這個主線程實際上創建子線程對象。子線程也由主線程啟動。

⑨ python多線程的幾種方法

Python進階(二十六)-多線程實現同步的四種方式
臨界資源即那些一次只能被一個線程訪問的資源,典型例子就是列印機,它一次只能被一個程序用來執行列印功能,因為不能多個線程同時操作,而訪問這部分資源的代碼通常稱之為臨界區。
鎖機制
threading的Lock類,用該類的acquire函數進行加鎖,用realease函數進行解鎖
import threadingimport timeclass Num:
def __init__(self):
self.num = 0
self.lock = threading.Lock() def add(self):
self.lock.acquire()#加鎖,鎖住相應的資源
self.num += 1
num = self.num
self.lock.release()#解鎖,離開該資源
return num

n = Num()class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item def run(self):
time.sleep(2)
value = n.add()#將num加1,並輸出原來的數據和+1之後的數據
print(self.item,value)for item in range(5):
t = jdThread(item)
t.start()
t.join()#使線程一個一個執行

當一個線程調用鎖的acquire()方法獲得鎖時,鎖就進入「locked」狀態。每次只有一個線程可以獲得鎖。如果此時另一個線程試圖獲得這個鎖,該線程就會變為「blocked」狀態,稱為「同步阻塞」(參見多線程的基本概念)。
直到擁有鎖的線程調用鎖的release()方法釋放鎖之後,鎖進入「unlocked」狀態。線程調度程序從處於同步阻塞狀態的線程中選擇一個來獲得鎖,並使得該線程進入運行(running)狀態。
信號量
信號量也提供acquire方法和release方法,每當調用acquire方法的時候,如果內部計數器大於0,則將其減1,如果內部計數器等於0,則會阻塞該線程,知道有線程調用了release方法將內部計數器更新到大於1位置。
import threadingimport timeclass Num:
def __init__(self):
self.num = 0
self.sem = threading.Semaphore(value = 3) #允許最多三個線程同時訪問資源

def add(self):
self.sem.acquire()#內部計數器減1
self.num += 1
num = self.num
self.sem.release()#內部計數器加1
return num

n = Num()class jdThread(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item def run(self):
time.sleep(2)
value = n.add()
print(self.item,value)for item in range(100):

⑩ Python多線程

那是當然。你這樣寫就可以了
self.p[:]=array

這樣寫法的含義就是指針不變。只換內容。這樣就可以同步了。

你的寫法是,新建一個數組,再把指針緞帶self.p,如果其它的線程就會出問題。

另外你的p應該放在__init__之前。引用時使用T.p來引用,這樣更合理一些。

閱讀全文

與python線程相關的資料

熱點內容
求知課堂python2020 瀏覽:261
kafka刪除topic命令 瀏覽:759
phpsql單引號 瀏覽:86
英雄聯盟壓縮壁紙 瀏覽:452
辦公app需要什麼伺服器 瀏覽:628
安卓伺服器怎麼獲得 瀏覽:808
空調壓縮機冷媒的作用 瀏覽:781
淘寶app是以什麼為利的 瀏覽:657
java提取圖片文字 瀏覽:924
我的世界手機版指令復制命令 瀏覽:35
java判斷字元串為數字 瀏覽:926
androidrpc框架 瀏覽:490
雲伺服器essd和ssd 瀏覽:524
家用網關的加密方式 瀏覽:3
怎麼從ppt導出pdf文件 瀏覽:973
換汽車空調壓縮機軸承 瀏覽:845
平板怎麼登錄安卓端 瀏覽:197
圖像拼接計演算法 瀏覽:257
怎麼打開飢荒伺服器的本地文件夾 瀏覽:293
usb掃描槍編程 瀏覽:675