日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

Python中Threading用法詳解

系統(tǒng) 2267 0

Python的threading模塊松散地基于Java的threading模塊。但現(xiàn)在線程沒有優(yōu)先級,沒有線程組,不能被銷毀、停止、暫停、開始和打斷。 Java Thread類的靜態(tài)方法,被移植成了模塊方法。

main thread: 運行python程序的線程

daemon thread 守護線程,如果守護線程之外的線程都結(jié)束了。守護線程也會結(jié)束,并強行終止整個程序。不要在守護進程中進行資源相關(guān)操作。會導(dǎo)致資源不能正確的釋放。在非守護進程中使用Event。

Thread 類

            
(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
          
            
group: 為以后的ThreadGroup類預(yù)留
target: 被執(zhí)行的對象,由run()方法執(zhí)行
args: target對象使用的參數(shù)
daemon: 是否為守護進程
          

start()

每個thread 對象都只能被調(diào)用1次start()

run()

如果創(chuàng)建Thread的子類,重寫該方法。負責(zé)執(zhí)行target參數(shù)傳來的可執(zhí)行對象。

join()

阻塞線程直到結(jié)束。

GIL

在CPython中,由于GIL的存在,Python每次只能執(zhí)行一個線程。如果要充分利用多核機器的計算資源需要使用multiprocessing或者是concurrent.futures.ProcessPollExecutor。 但,但如果你想要很多I/O相關(guān)的并發(fā)操作,threding仍然是一個很好的選擇 。?因為系統(tǒng)自動實現(xiàn)了線程的上下文切換。

            
from threading import Thread
import requests
url = 'http://www.baidu.com'
urls = [url]*20
threads = []

for url in urls:
  t = Thread(target=requests.get, args=(url, ))
  t.start()
  threads.append(t)
for t in threads:
  t.join()
          

鎖(Lock)對象

原始鎖(primitive lock),當(dāng)它鎖住的時候,它是一種不屬于任何一個線程的同步原語(synchronization primitive)。 在Python中,他是目前可用的最底層的同步原語,由_thread模塊提供。

一個原始鎖有兩個狀態(tài):locked 和unlocked。鎖創(chuàng)建時,處于unlocked狀態(tài)。 鎖由兩個基本方法:acquire()和release()。

當(dāng)處于unlocked狀態(tài)時,acquire(()方法可以將狀態(tài)變?yōu)閘ocked,并立即返回。當(dāng)處于locked狀態(tài)時,acquire()會阻塞直至另一個線程調(diào)用了release()使改鎖解鎖,然后acquire()將鎖上鎖,并返回。

release()方法只能在鎖locked時別調(diào)用,并釋放鎖。否則會拋出RuntimeError錯誤。

如果有多個 acquire()在等待解鎖,則不確定哪一個哪一個會被觸發(fā)。

class threading.Lock

如果一個線程acquire了一個鎖,那么后續(xù)獲取它的線程都會被阻塞,直至鎖被釋放。任何線程都可以釋放鎖。

Lock是一個工廠函數(shù),返回當(dāng)前平臺下最高效的concrete Lock類的實例。

Lock支持上下文管理方法(context management protocol),也就是with 語句。在存在競態(tài)條件(race condition)的時候,要使用鎖。比如多線程共同操作某個數(shù)據(jù)。

            
# 摘自python Cookbook
import threading
class SharedCounter:
  def __init__(self, init_value=0):
    self._value = init_value
    self._value_lock = threading.Lock()  
  def incr(self, delta=1):
    # 在這里使用了with 語句,創(chuàng)建一個鎖,增加值,釋放鎖。
    with self._value_lock:
      self._value += 1
          

RLock對象

可重入鎖(reentrant lock)。感覺是一個鎖中鎖,就是可以遞歸的鎖。等見到具體的應(yīng)用例子再寫。

Condition對象

condition變量總是與某種鎖相關(guān),鎖可以是傳過來的,也可以通過默認設(shè)置創(chuàng)建。如果有多個 condition對象需要共享一個鎖時,傳遞一個鎖是非常有用的。鎖是condition對象的一部分,你不用刻意的跟蹤它。

Timer對象

Timer是Thread的子類,所以也要接受function參數(shù),也可以被start()。 它的run()函數(shù)被重寫為先event.wait(interval),再啟動function。

Barrier對象

實現(xiàn)某些服務(wù)的共進退。

            
threading.Barrier(parties, action=None, timeout=None)
          

設(shè)置n=parties個線程,當(dāng)n個barrier.wait()被調(diào)用后,所有這些調(diào)用的阻塞被同時解除,執(zhí)行action

感覺Barrier可以實現(xiàn)很多復(fù)雜的功能。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 灵丘县| 乃东县| 金秀| 新平| 子长县| 塔城市| 富川| 渝中区| 镇原县| 凌云县| 博罗县| 无锡市| 灵石县| 丁青县| 九江市| 长海县| 洛川县| 寿阳县| 朝阳市| 双柏县| 翁牛特旗| 靖边县| 黄大仙区| 民乐县| 濉溪县| 康定县| 托里县| 册亨县| 延边| 垣曲县| 温宿县| 鲜城| 东辽县| 肃南| 新宁县| 兴义市| 义乌市| 安平县| 桃园市| 临邑县| 灌云县|