最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python中Threading用法詳解

 更新時(shí)間:2017年12月27日 08:46:34   投稿:laozhang  
本篇文章給大家介紹了Python中Threading的詳細(xì)用法,需要的朋友跟著小編一起學(xué)習(xí)下吧。

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

main thread: 運(yùn)行python程序的線程

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

Thread 類

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

start()

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

run()

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

join()

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

GIL

在CPython中,由于GIL的存在,Python每次只能執(zhí)行一個(gè)線程。如果要充分利用多核機(jī)器的計(jì)算資源需要使用multiprocessing或者是concurrent.futures.ProcessPollExecutor。 但,但如果你想要很多I/O相關(guān)的并發(fā)操作,threding仍然是一個(gè)很好的選擇 。?因?yàn)橄到y(tǒng)自動(dòng)實(shí)現(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)它鎖住的時(shí)候,它是一種不屬于任何一個(gè)線程的同步原語(synchronization primitive)。 在Python中,他是目前可用的最底層的同步原語,由_thread模塊提供。

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

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

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

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

class threading.Lock

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

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

Lock支持上下文管理方法(context management protocol),也就是with 語句。在存在競態(tài)條件(race condition)的時(shí)候,要使用鎖。比如多線程共同操作某個(gè)數(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)建一個(gè)鎖,增加值,釋放鎖。
    with self._value_lock:
      self._value += 1

RLock對象

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

Condition對象

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

Timer對象

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

Barrier對象

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

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

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

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

相關(guān)文章

最新評論

和硕县| 徐闻县| 镇远县| 乐亭县| 台东市| 墨竹工卡县| 柳州市| 信丰县| 淮安市| 大厂| 兰坪| 五华县| 曲沃县| 天柱县| 祁连县| 江都市| 平塘县| 饶阳县| 新兴县| 从江县| 荔浦县| 安阳县| 台山市| 隆安县| 定襄县| 沂南县| 那坡县| 莱芜市| 宾阳县| 当涂县| 临桂县| 阜平县| 讷河市| 锡林浩特市| 通海县| 泸水县| 怀集县| 岚皋县| 深圳市| 漳州市| 长治市|