threadingpython
『壹』 python threading start 什麼意思
啟動多線程
threading是Python多線程模塊thread,threading,Queue中的一個
不同於thread的是,你要去覆寫threading這個類,然後在裡面實現他的一些方法
例如,你程序中有一個方法
importthreading
classrunner(threading.Thread):
'''
實現多線程
'''
def__init__(self,url):
#初始化,設置傳入的參數
threading.Thread.__init__(self)
self.url=url
self.thread_stop=False
defrun(self):
tmp=crawl(self.url)#調用一個其它方法
save(tmp)#另一個方法
defstop(self):
self.thread_stop=True
url='.com'
t=runner(url)
t.start()#啟動多線程
『貳』 Python多線程總結
在實際處理數據時,因系統內存有限,我們不可能一次把所有數據都導出進行操作,所以需要批量導出依次操作。為了加快運行,我們會採用多線程的方法進行數據處理, 以下為我總結的多線程批量處理數據的模板:
主要分為三大部分:
共分4部分對多線程的內容進行總結。
先為大家介紹線程的相關概念:
在飛車程序中,如果沒有多線程,我們就不能一邊聽歌一邊玩飛車,聽歌與玩 游戲 不能並行;在使用多線程後,我們就可以在玩 游戲 的同時聽背景音樂。在這個例子中啟動飛車程序就是一個進程,玩 游戲 和聽音樂是兩個線程。
Python 提供了 threading 模塊來實現多線程:
因為新建線程系統需要分配資源、終止線程系統需要回收資源,所以如果可以重用線程,則可以減去新建/終止的開銷以提升性能。同時,使用線程池的語法比自己新建線程執行線程更加簡潔。
Python 為我們提供了 ThreadPoolExecutor 來實現線程池,此線程池默認子線程守護。它的適應場景為突發性大量請求或需要大量線程完成任務,但實際任務處理時間較短。
其中 max_workers 為線程池中的線程個數,常用的遍歷方法有 map 和 submit+as_completed 。根據業務場景的不同,若我們需要輸出結果按遍歷順序返回,我們就用 map 方法,若想誰先完成就返回誰,我們就用 submit+as_complete 方法。
我們把一個時間段內只允許一個線程使用的資源稱為臨界資源,對臨界資源的訪問,必須互斥的進行。互斥,也稱間接制約關系。線程互斥指當一個線程訪問某臨界資源時,另一個想要訪問該臨界資源的線程必須等待。當前訪問臨界資源的線程訪問結束,釋放該資源之後,另一個線程才能去訪問臨界資源。鎖的功能就是實現線程互斥。
我把線程互斥比作廁所包間上大號的過程,因為包間里只有一個坑,所以只允許一個人進行大號。當第一個人要上廁所時,會將門上上鎖,這時如果第二個人也想大號,那就必須等第一個人上完,將鎖解開後才能進行,在這期間第二個人就只能在門外等著。這個過程與代碼中使用鎖的原理如出一轍,這里的坑就是臨界資源。 Python 的 threading 模塊引入了鎖。 threading 模塊提供了 Lock 類,它有如下方法加鎖和釋放鎖:
我們會發現這個程序只會列印「第一道鎖」,而且程序既沒有終止,也沒有繼續運行。這是因為 Lock 鎖在同一線程內第一次加鎖之後還沒有釋放時,就進行了第二次 acquire 請求,導致無法執行 release ,所以鎖永遠無法釋放,這就是死鎖。如果我們使用 RLock 就能正常運行,不會發生死鎖的狀態。
在主線程中定義 Lock 鎖,然後上鎖,再創建一個子 線程t 運行 main 函數釋放鎖,結果正常輸出,說明主線程上的鎖,可由子線程解鎖。
如果把上面的鎖改為 RLock 則報錯。在實際中設計程序時,我們會將每個功能分別封裝成一個函數,每個函數中都可能會有臨界區域,所以就需要用到 RLock 。
一句話總結就是 Lock 不能套娃, RLock 可以套娃; Lock 可以由其他線程中的鎖進行操作, RLock 只能由本線程進行操作。
『叄』 Python Threading 是怎麼的用法
多線程/多進程都是通訊或者回調,而不是直接返回結果。這個很容易理解的,因為如果你用返回結果來給一個變數賦值,你就必須等待這個函數結束,你這個程序就阻塞了,這就失去了多線程/多進程防止阻塞的意義了。 通訊可以是事件驅動或者用線程安全
『肆』 python threading代理對象怎麼傳遞
先來看這段代碼:
import threading
import time
def worker():
print 「worker」
time.sleep(1)
return
for i in xrange(5):
t = threading.Thread(target=worker)
t.start()
這段代碼就使用了多線程,但是沒法傳遞參數,而實際使用多線程,往往是需要傳遞參數的,於是問了一位群里的網友後,知道可以這么寫實現傳遞參數的多線程:
import threading
import time
def worker(number):
print 「worker」
time.sleep(number)
return
for i in xrange(5):
t = threading.Thread(target=worker,args=(i,))
t.start()
第一個參數是線程函數變數,第二個參數args是一個數組變數參數,如果只傳遞一個值,就只需要i, 如果需要傳遞多個參數,那麼還可以繼續傳遞下去其他的參數,其中的逗號不能少,少了就不是數組了,就會出錯。
『伍』 python threading是什麼庫
Python通過兩個標准庫thread和threading提供對線程的支持。thread提供了低級別的、原始的線程以及一個簡單的鎖。threading模塊不僅提供了thread類,還提供了各種同步機制
『陸』 python的Threading怎麼返回值
class QueryWork(Thread):
api={}
flag=''
def __init__(self,queue,target,func_list=None, hook):
Thread.__init__(self)
self.queue=queue
self.target=target
self.hook = hook
def run(self):
mutex=threading.Lock()
try:
while 1:
mutex.acquire()
api=self.queue.get(False)
q=Query(self.target)
self.api,self.flag=q.queryRegister(api)
self.hook(self.api, self.flag)
print self.api['website'],self.api['weburl'],self.flag
mutex.release()
except Exception,e:
pass
def getRet(self):
return (self.api, self.flag)
def hook(zapi, zflag):
print zapi, zflag
『柒』 Python多線程之threading之Lock對象
要介紹Python的 threading 模塊中的 Lock 對象前, 首先應該了解以下兩個概念:
1.基本概念 : 指某個函數/函數庫在多線程環境中被調用時, 能夠正確地處理多個線程之間的 共享變數 , 使程序功能正常完成. 多個線程訪問同一個對象時, 如果不用考慮這些線程在運行時環境下的調度和交替執行, 也不需要進行額外的同步, 或者在調用方進行任何其他操作,調用這個對象的行為都可以獲得正確的結果, 那麼這個對象就是線程安全的. 或者說: 一個類或者程序所提供的介面對於線程來說是 原子操作 或者多個線程之間的切換不會導致該介面的執行結果存在二義性, 也就是說我們不用考慮同步的問題.
2.示例 : 比如有間銀行只有1000元, 而兩個人同時提領1000元時,就有可能拿到總計2000元的金額. 為了避免這個問題, 該間銀行提款時應該使用 互斥鎖 , 即意味著對同一個資源處理時, 前一個提領交易完成後才處理下一筆交易.
3.線程安全意義 :
4.是否線程安全 :
5.資源競爭 : 即多個線程對同一個資源的改寫時, 存在的一種競爭. 如果僅僅是讀操作, 則不存在資源競爭的情況.
1.基本概念 : 因為存在上述所說的 線程安全與資源競爭 的情況, 所以引入了 線程鎖 . 即通過鎖來進行資源請求的限制, 以保證同步執行,避免資源被污染或預期結果不符. 線程鎖存在兩種狀態: 鎖定(locked)和非鎖定(unlocked).
2.基本方法 :
3.使用示例 :
上述示例如果在不加鎖的情況下, 將會出現列印順序混亂的情況, 不過最終結果都是正確的, 因為即使線程交替執行, 但最終的結果都是一致.
『捌』 Python:進程(threading)
這里是自己寫下關於 Python 跟進程相關的 threading 模塊的一點筆記,跟有些跟 Linux 調用挺像的,有共通之處。
https://docs.python.org/3/library/threading.html?highlight=threading#thread-objects
直接傳入
繼承 Thread 重寫 run 方法
threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
group 線程組,未實現
start() 線程就緒
join([timeout]) 阻塞其他線程,直到調用這方法的進程結束或時間到達
RuntimeError: cannot join thread before it is started
get/setName(name) 獲取/設置線程名。
isAlive() 返回線程是否在運行。
is/setDaemon(bool): 獲取/設置是後台線程(默認前台線程(False))。(在start之前設置)
The entire Python program exits when no alive non-daemon threads are left.
沒有非後台進程運行,Python 就退出。
主線程執行完畢後,後台線程不管是成功與否,主線程均停止
t.start()
t.join()
start() 後 join() 會順序執行,失去線程意義
https://docs.python.org/3/library/threading.html?#lock-objects
Lock屬於全局,Rlock屬於線程(R的意思是可重入,線程用Lock的話會死鎖,來看例子)
acquire(blocking=True, timeout=-1) 申請鎖,返回申請的結果
release() 釋放鎖,沒返回結果
https://docs.python.org/3/library/threading.html#condition-objects
可以在構造時傳入rlock lock實例,不然自己生成一個。
acquire([timeout])/release(): 與lock rlock 相同
wait([timeout]): 調用這個方法將使線程進入等待池,並釋放鎖。調用方法前線程必須已獲得鎖定,否則將拋出異常。
notify(): 調用這個方法將從等待池挑選一個線程並通知,收到通知的線程將自動調用acquire()嘗試獲得鎖定(進入鎖定池);其他線程仍然在等待池中。調用這個方法不會釋放鎖定。調用方法前線程必須已獲得鎖定,否則將拋出異常。
notifyAll(): 調用這個方法將通知等待池中所有的線程,這些線程都將進入鎖定池嘗試獲得鎖定。調用這個方法不會釋放鎖定。使用前線程必須已獲得鎖定,否則將拋出異常。
threading.Semaphore(value=1)
https://docs.python.org/3/library/threading.html#semaphore-objects
acquire(blocking=True, timeout=None)
資源數大於0,減一並返回,等於0時等待,blocking為False不阻塞進程
返回值是申請結果
release()
資源數加1
https://docs.python.org/3/library/threading.html#event-objects
事件內置了一個初始為False的標志
is_set() 返回內置標志的狀態
set() 設為True
clear() 設為False
wait(timeout=None) 阻塞線程並等待,為真時返回。返回值只會在等待超時時為False,其他情況為True
https://docs.python.org/3/library/threading.html#timer-objects
threading.Timer(interval, function, args=None, kwargs=None)
第一個參數是時間間隔,單位是秒,整數或者浮點數,負數不會報錯直接執行不等待
可以用cancel() 取消
https://docs.python.org/3/library/threading.html#barrier-objects
threading.Barrier(parties, action=None, timeout=None)
調用的進程數目達到第一個設置的參數就喚醒全部進程
wait(timeout=None)
reset() 重置,等待中的進程收到 BrokenBarrierError 錯誤
『玖』 python中的threading怎麼用
hread 是threading模塊中最重要的類之一,可以使用它來創建線程。有兩種方式來創建線程:一種是通過繼承Thread類,重寫它的run方法;另一種是創建一個threading.Thread對象,在它的初始化函數(__init__)中將可調用對象作為參數傳入。下面分別舉例說明。先來看看
-------我是華麗的分割線---------
不懂可以繼續追問
會給你更好地建議,幫助解決可困難,喂網路知道做貢獻