python 線程的暫停, 恢復(fù), 退出詳解及實(shí)例
python 線程 暫停, 恢復(fù), 退出
我們都知道python中可以是threading模塊實(shí)現(xiàn)多線程, 但是模塊并沒(méi)有提供暫停, 恢復(fù)和停止線程的方法, 一旦線程對(duì)象調(diào)用start方法后, 只能等到對(duì)應(yīng)的方法函數(shù)運(yùn)行完畢. 也就是說(shuō)一旦start后, 線程就屬于失控狀態(tài). 不過(guò), 我們可以自己實(shí)現(xiàn)這些. 一般的方法就是循環(huán)地判斷一個(gè)標(biāo)志位, 一旦標(biāo)志位到達(dá)到預(yù)定的值, 就退出循環(huán). 這樣就能做到退出線程了. 但暫停和恢復(fù)線程就有點(diǎn)難了, 我一直也不清除有什么好的方法, 直到我看到threading中Event對(duì)象的wait方法的描述時(shí).
wait([timeout]) Block until the internal flag is true. If the internal flag is true on entry, return immediately. Otherwise, block until another thread calls set() to set the flag to true, or until the optional timeout occurs. 阻塞, 直到內(nèi)部的標(biāo)志位為True時(shí). 如果在內(nèi)部的標(biāo)志位在進(jìn)入時(shí)為True時(shí), 立即返回. 否則, 阻塞直到其他線程調(diào)用set()方法將標(biāo)準(zhǔn)位設(shè)為True, 或者到達(dá)了可選的timeout時(shí)間. When the timeout argument is present and not None, it should be a floating point number specifying a timeout for the operation in seconds (or fractions thereof). This method returns the internal flag on exit, so it will always return True except if a timeout is given and the operation times out. 當(dāng)給定了timeout參數(shù)且不為None, 它應(yīng)該是一個(gè)浮點(diǎn)數(shù),以秒為單位指定操作的超時(shí)(或是分?jǐn)?shù))。 此方法在退出時(shí)返回內(nèi)部標(biāo)志,因此除非給定了超時(shí)且操作超時(shí),否則它將始終返回True。 Changed in version 2.7: Previously, the method always returned None. 2.7版本以前, 這個(gè)方法總會(huì)返回None.
利用wait的阻塞機(jī)制, 就能夠?qū)崿F(xiàn)暫停和恢復(fù)了, 再配合循環(huán)判斷標(biāo)識(shí)位, 就能實(shí)現(xiàn)退出了, 下面是代碼示例:
#!/usr/bin/env python
# coding: utf-8
import threading
import time
class Job(threading.Thread):
def __init__(self, *args, **kwargs):
super(Job, self).__init__(*args, **kwargs)
self.__flag = threading.Event() # 用于暫停線程的標(biāo)識(shí)
self.__flag.set() # 設(shè)置為True
self.__running = threading.Event() # 用于停止線程的標(biāo)識(shí)
self.__running.set() # 將running設(shè)置為True
def run(self):
while self.__running.isSet():
self.__flag.wait() # 為True時(shí)立即返回, 為False時(shí)阻塞直到內(nèi)部的標(biāo)識(shí)位為True后返回
print time.time()
time.sleep(1)
def pause(self):
self.__flag.clear() # 設(shè)置為False, 讓線程阻塞
def resume(self):
self.__flag.set() # 設(shè)置為True, 讓線程停止阻塞
def stop(self):
self.__flag.set() # 將線程從暫停狀態(tài)恢復(fù), 如何已經(jīng)暫停的話
self.__running.clear() # 設(shè)置為False
下面是測(cè)試代碼:
a = Job() a.start() time.sleep(3) a.pause() time.sleep(3) a.resume() time.sleep(3) a.pause() time.sleep(2) a.stop()
測(cè)試的結(jié)果:

這完成了暫停, 恢復(fù)和停止的功能. 但是這里有一個(gè)缺點(diǎn): 無(wú)論是暫停還是停止, 都不是瞬時(shí)的, 必須等待run函數(shù)內(nèi)部的運(yùn)行到達(dá)標(biāo)志位判斷時(shí)才有效. 也就是說(shuō)操作會(huì)滯后一次.
但是這有時(shí)也不一定是壞事. 如果run函數(shù)中涉及了文件操作或數(shù)據(jù)庫(kù)操作等, 完整地運(yùn)行一次后再退出, 反而能夠執(zhí)行剩余的資源釋放操作的代碼(例如各種close). 不會(huì)出現(xiàn)程序的文件操作符超出上限, 數(shù)據(jù)庫(kù)連接未釋放等尷尬的情況.
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Python通過(guò)zookeeper實(shí)現(xiàn)分布式服務(wù)代碼解析
這篇文章主要介紹了Python通過(guò)zookeeper實(shí)現(xiàn)分布式服務(wù)代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
pytorch+lstm實(shí)現(xiàn)的pos示例
今天小編就為大家分享一篇pytorch+lstm實(shí)現(xiàn)的pos示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
python和Appium移動(dòng)端多設(shè)備自動(dòng)化測(cè)試框架實(shí)現(xiàn)
這篇文章主要介紹了python和Appium移動(dòng)端多設(shè)備自動(dòng)化測(cè)試框架實(shí)現(xiàn),基于pytest和Appium框架,支持Android和iOS功能自動(dòng)化的測(cè)試框架的相關(guān)內(nèi)容,需要的小伙伴可以參考一下2022-04-04
基于Python新建用戶并產(chǎn)生隨機(jī)密碼過(guò)程解析
這篇文章主要介紹了基于Python新建用戶并產(chǎn)生隨機(jī)密碼過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10
全面剖析Python的Django框架中的項(xiàng)目部署技巧
這篇文章主要全面剖析了Python的Django框架的部署技巧,包括Fabric等自動(dòng)化部署和建立單元測(cè)試等方面,強(qiáng)烈推薦!需要的朋友可以參考下2015-04-04
基于Python編寫一個(gè)B站全自動(dòng)抽獎(jiǎng)的小程序
本文將利用Python編寫一個(gè)B站全自動(dòng)抽獎(jiǎng)的小程序,可以實(shí)時(shí)監(jiān)控自己關(guān)注的UP主,如果關(guān)注的UP主中有人發(fā)布了抽獎(jiǎng)的動(dòng)態(tài),就自動(dòng)參與這個(gè)抽獎(jiǎng)。這樣就能不錯(cuò)過(guò)任何一個(gè)可以暴富的機(jī)會(huì)了。需要的可以參考一下2022-03-03
Python eval函數(shù)的實(shí)現(xiàn)
這篇文章主要介紹了Python eval函數(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Python3中在Anaconda環(huán)境下安裝basemap包
今天小編就為大家分享一篇關(guān)于Python3中在Anaconda環(huán)境下安裝basemap包的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
numpy.random.seed()的使用實(shí)例解析
這篇文章主要介紹了numpy.random.seed()的使用實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02

