python線程
Ⅰ python多線程
那是當然。你這樣寫就可以了
self.p[:]=array
這樣寫法的含義就是指針不變。只換內容。這樣就可以同步了。
你的寫法是,新建一個數組,再把指針緞帶self.p,如果其它的線程就會出問題。
另外你的p應該放在__init__之前。引用時使用T.p來引用,這樣更合理一些。
Ⅱ Python多線程是什麼意思
多線程能讓你像運行一個獨立的程序一樣運行一段長代碼。這有點像調用子進程(subprocess),不過區別是你調用shu的是一個函數或者一個類,而不是獨立的程序。
程基本上是一個獨立執行流程。單個進程可以由多個線程組成。程序中的每個線程都執行特定的任務。例如,當你在電腦上玩游戲時,比如說國際足聯,整個游戲是一個單一的過程。,但它由幾個線程組成,負責播放音樂、接收用戶的輸入、同步運行對手等。所有這些都是單獨的線程,負責在同一個程序中執行這些不同的任務。
每個進程都有一個始終在運行的線程。這是主線。這個主線程實際上創建子線程對象。子線程也由主線程啟動。
Ⅲ Python 線程初始化
__init__函數是service類的初始化函數
這個函數中參數server_ip,server_port沒有默認值,初始化service類實例時必須給這兩個參數傳值
上面的代碼除了定義__init__函數體外,沒有任何其它的代碼,不知道在那裡初始了service類實例
如果你指的是threading.Thread.__init__(self)語句的話,這是調用父類的初始化方法
Ⅳ 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 的多線程是雞肋
因為 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 怎麼實現多線程的
線程也就是輕量級的進程,多線程允許一次執行多個線程,Python是多線程語言,它有一個多線程包,GIL也就是全局解釋器鎖,以確保一次執行單個線程,一個線程保存GIL並在將其傳遞給下一個線程之前執行一些操作,也就產生了並行執行的錯覺。
Ⅶ 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主線程設置
輸入模塊可以使用其功能的其他程序。這就是為什麼我們使用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所列的目錄之一。