日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python库(2)—— threading

發(fā)布時(shí)間:2024/8/23 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python库(2)—— threading 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

python 多線(xiàn)程受制于Global Interpreter Lock(GIL)并不能充分利用多處理器,僅僅是多線(xiàn)程同步使用一個(gè)處理器,因此該模塊適用于I/O為主的程序。

1. Thread對(duì)象
  class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
  使用上面函數(shù)創(chuàng)建一個(gè)新的Thread實(shí)例。
  target:即線(xiàn)程的目標(biāo)函數(shù),線(xiàn)程啟動(dòng)時(shí),run()方法將調(diào)用此函數(shù)。
  name:線(xiàn)程的名字,是一個(gè)字符串;默認(rèn)將創(chuàng)建一個(gè)“Thread-N”格式的唯一名稱(chēng)。
  args:傳遞給target函數(shù)的參數(shù)元組;注意,必須是元組,因此注意僅有一個(gè)參數(shù)時(shí)的情況。
  Thread實(shí)例t支持以下方法和屬性:
  (1) t.start()
    通過(guò)在一個(gè)單獨(dú)的控制線(xiàn)程中調(diào)用run()方法,啟動(dòng)線(xiàn)程。此方法只能調(diào)用一次。
  (2) t.run()
    線(xiàn)程啟動(dòng)時(shí)將調(diào)用此方法。默認(rèn)情況,它將調(diào)用傳遞到構(gòu)造函數(shù)中的target函數(shù);除此之外,還可以在Thread子類(lèi)中重新定義此方法。
  (3) t.is_alive()
    如果線(xiàn)程是活動(dòng)的,返回True;否則返回False。
  (4) t.name
    線(xiàn)程名稱(chēng),是一個(gè)屬性。可以通過(guò)它更改或獲得線(xiàn)程的名字。
  (5) t.daemon
    線(xiàn)程的布爾型后臺(tái)標(biāo)志,是一個(gè)屬性。必須在調(diào)用t.start()之前設(shè)置該值。它表示該線(xiàn)程是否是以daemon的形式執(zhí)行,它的初始值繼承自創(chuàng)建它的線(xiàn)程,因此一般是False。
    threading會(huì)在主線(xiàn)程執(zhí)行完畢后,檢查是否有daemon為False的子線(xiàn)程,如果有,主線(xiàn)程就wait,等待子線(xiàn)程結(jié)束,在等待期間,所有發(fā)送到主線(xiàn)程的信號(hào)也會(huì)被阻塞,因此Ctrl-C不起作用。如果子線(xiàn)程的daemon都是True,那么主線(xiàn)程執(zhí)行完畢后不會(huì)等待,整個(gè)程序(包括主線(xiàn)程和子線(xiàn)程)立即結(jié)束。
    因此,比較常用的方法,就是將子線(xiàn)程的daemon設(shè)為T(mén)rue,并且在主線(xiàn)程結(jié)束前輪尋檢測(cè)。
  (6) t.join([timeout])
    等待線(xiàn)程t,直到t終止或出現(xiàn)超時(shí)為止。timeout是一個(gè)浮點(diǎn)數(shù),用于指定以秒為單位的超時(shí)時(shí)間。線(xiàn)程不能夠join自己,而且不能在t運(yùn)行之前就調(diào)用t.join()
    當(dāng)一個(gè)線(xiàn)程調(diào)用t.join()等待時(shí),也會(huì)出現(xiàn)上文提到的wait,無(wú)法接收信號(hào),因此如果主線(xiàn)程調(diào)用t.join(),將導(dǎo)致Ctrl-C失效。

  示例:

import threadingimport timedef clock(interval):print "this is subThread!"time.sleep(interval)t=theading.Thread(target=clock,args=(15,))t.daemon=Truet.start()while t.is_alive():time.sleep(1)下面的例子實(shí)現(xiàn)了同樣的功能:import threadingimport timeclass Clock(threading.Thread):def __init__(self,interval):threading.Thread.__init__(self)self.daemon=Trueself.interval=intervaldef run(self):print "this is subThread!"time.sleep(self.interval)t=Clock(15)t.start()while t.is_alive():time.sleep(1)

上面的方法將線(xiàn)程定義為類(lèi),并且定義自己的__init__()方法,并且必須像上面那樣調(diào)用基類(lèi)構(gòu)造函數(shù)Thread.__init__()。除此之外,需要重寫(xiě)run()方法,作為線(xiàn)程的目標(biāo)函數(shù)。除了run()方法之外,重寫(xiě)已經(jīng)定義的其他方法會(huì)出現(xiàn)錯(cuò)誤。 ?

2. Timer對(duì)象
  class threading.Timer(interval, function, args=[], kwargs={})
  創(chuàng)建定時(shí)器對(duì)象,在過(guò)去interval秒時(shí)間后運(yùn)行函數(shù)function。args提供傳遞給function的參數(shù)。在調(diào)用start()方法后會(huì)啟動(dòng)定時(shí)器。
  Timer對(duì)象t具有以下方法:
  (1) t.start()
    啟動(dòng)定時(shí)器。提供給Timer()方法的函數(shù)function將在指定的interval之后執(zhí)行。
  (2) t.cancel()
    如果function函數(shù)尚未執(zhí)行,取消定時(shí)器。
  示例:

import threadingdef hello():print "hello, world"t = threading.Timer(10.0, hello)t.start() # after 30 seconds, "hello, world" will be printed

  在等待function執(zhí)行這段期間,Ctrl-C失效

3. Lock對(duì)象
  最基本的同步鎖,并不屬于某一個(gè)特定的線(xiàn)程,也就是說(shuō),一個(gè)線(xiàn)程設(shè)定的鎖可以由另一個(gè)線(xiàn)程進(jìn)行解鎖。
  通過(guò)lock=threading.Lock()創(chuàng)建Lock實(shí)例:
  (1) lock.acquire([blocking])
    獲取鎖定,需要阻塞到鎖定釋放為止。
  (2) lock.release()
    釋放一個(gè)鎖定。當(dāng)鎖處于未鎖定情況時(shí),進(jìn)行解鎖會(huì)異常;允許其他進(jìn)程解鎖

4. RLock對(duì)象
  同步鎖,屬于某一個(gè)特定的線(xiàn)程,也就是說(shuō),一個(gè)線(xiàn)程設(shè)定的鎖僅能由該線(xiàn)程解鎖;其他進(jìn)程若試圖解鎖會(huì)引發(fā)異常。RLock允許在同一線(xiàn)程中被多次acquire,而Lock卻不允許這種情況。注意:如果使用RLock,那么acquire和release必須成對(duì)出現(xiàn),即調(diào)用了n次acquire,必須調(diào)用n次的release才能真正釋放所占用的瑣。這條是正確的,可以開(kāi)兩個(gè)線(xiàn)程試一下!
  通過(guò)rlock=threading.RLock()創(chuàng)建RLock實(shí)例:
  (1) rlock.acquire([blocking])
  (2) rlock.release()

5. Semaphore對(duì)象
  信號(hào)量是一個(gè)基于計(jì)數(shù)器的同步原語(yǔ),每次調(diào)用acquire()方法時(shí)此計(jì)數(shù)器減1,每次調(diào)用release()方法時(shí)此計(jì)數(shù)器加1。如果計(jì)數(shù)器為0,acquire()方法將會(huì)阻塞,直到其他線(xiàn)程調(diào)用release()方法為止。
  class threading.Semaphore([value])
  創(chuàng)建一個(gè)新的信號(hào)量。value是計(jì)數(shù)器的初始值,如果省略此參數(shù),計(jì)數(shù)器的值將被置1.
  Semaphore實(shí)例s支持以下方法。
  (1) s.acquire([blocking])
    獲取信號(hào)量。如果進(jìn)入時(shí)內(nèi)部計(jì)數(shù)器大于0,此方法將把它的值減1,然后立即返回。如果它的值為0,此方法將被阻塞,直到另一個(gè)線(xiàn)程調(diào)用release()方法為止。
  (2) s.release()
    通過(guò)將內(nèi)部計(jì)數(shù)器的值加1來(lái)釋放一個(gè)信號(hào)量。
  (3) BoundedSemaphore([value])
    創(chuàng)建一個(gè)新的信號(hào)機(jī)。它的工作方式與Semaphore完全相同,但是release()操作的次數(shù)不能超過(guò)acquire()操作的次數(shù)(Semaphore可能存在這樣的隱患)

6. 實(shí)用工具函數(shù)
  (1) threading.active_count()
    返回當(dāng)前活動(dòng)的Thread對(duì)象數(shù)量,包括主線(xiàn)程
  (2) threading.current_thread()
    返回當(dāng)前Thread對(duì)象,在線(xiàn)程內(nèi)部調(diào)用。
  (3) threading.enumerate()
    返回當(dāng)前活動(dòng)的Thread對(duì)象列表

轉(zhuǎn)載于:https://www.cnblogs.com/zhangjing327/p/3498308.html

總結(jié)

以上是生活随笔為你收集整理的python库(2)—— threading的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。