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

Python多線程的退出控制實(shí)現(xiàn)

 更新時(shí)間:2020年08月10日 14:32:57   作者:Messy..  
這篇文章主要介紹了Python多線程的退出控制實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

日常前言

最近接 到一個(gè)搶票的爬蟲(chóng)外包,那個(gè)網(wǎng)站及其之撈,訪問(wèn)購(gòu)票地址竟然還要排隊(duì),在購(gòu)票高峰臨時(shí)升一下服務(wù)器配置不行嗎…沒(méi)辦法,甲方爸爸的要求還得做啊,其中一個(gè)障礙便是目標(biāo)網(wǎng)站的后端限制了訪問(wèn)頻次,俗話說(shuō):“上有政策,下有對(duì)策?!?立刻想到了多線程 + 多代理的方式進(jìn)行訪問(wèn)。

但此時(shí)問(wèn)題便來(lái)了,多代理還好說(shuō),再寫(xiě)個(gè)爬蟲(chóng)爬一堆下來(lái)就好,多線程可就麻煩多了,多線程一旦發(fā)出去了,基本等同于失控的狀態(tài),你無(wú)法去結(jié)束或者是重啟一個(gè)線程,最多只能是獲取線程的信息,沒(méi)有實(shí)際的控制權(quán),而且Python官方也沒(méi)有提供相應(yīng)的結(jié)束函數(shù)。那么接下來(lái),讓我們來(lái)好好聊聊解決這個(gè)問(wèn)題的思路。

單線程的結(jié)束

說(shuō)實(shí)話,會(huì)百度在程序世界是一個(gè)優(yōu)秀的習(xí)慣,不然怎么會(huì)有這么一張表情包呢


但是百度這一次卻不盡人意,搜了很久,結(jié)果不盡人意,基本上所有的搜索結(jié)果都告訴我只有結(jié)束單個(gè)線程的方法,我也試過(guò)循環(huán)使用百度的結(jié)束函數(shù),但最終都只能是結(jié)束的當(dāng)前的這一個(gè)線程,無(wú)法達(dá)到目標(biāo)。

貼一段搜到的單線程結(jié)束代碼示例

def _async_raise(tid, exctype):
 tid = ctypes.c_long(tid)
 if not inspect.isclass(exctype):
  exctype = type(exctype)
 res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, ctypes.py_object(exctype))
 if res == 0:
  raise ValueError("invalid thread id")
 elif res != 1:
  ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
  raise SystemError("PyThreadState_SetAsyncExc failed")
  
def stop_thread(thread):
 _async_raise(thread.ident, SystemExit)

那怎么結(jié)束多個(gè)線程呢?

既然度娘也搜不到,那就自己探索,打開(kāi)python threading模塊的官方文檔,其中一個(gè)daemon屬性進(jìn)入了視野,單詞翻譯過(guò)來(lái)便是守護(hù)進(jìn)程,相信大家應(yīng)該或多或少的聽(tīng)到過(guò),以下是官方的釋義,大概意思就是只要在啟動(dòng)線程之前設(shè)置了這個(gè)屬性為T(mén)rue,當(dāng)父進(jìn)程結(jié)束時(shí),所有的子進(jìn)程跟著全部結(jié)束,這樣就好辦了,接下來(lái)看看代碼部分。

daemon
A boolean value indicating whether this thread is a daemon thread (True) or not (False). This must be set before start() is called, otherwise RuntimeError is raised. Its initial value is inherited from the creating thread; the main thread is not a daemon thread and therefore all threads created in the main thread default to daemon = False.

完整代碼

import threading,time,random

class Messy:
 def __init__(self):
  self.__messy = 0

 def m(self,i):
		# 隨機(jī)時(shí)間進(jìn)行打印
  time.sleep(random.random()*2)
  print(i)
  if i == 1:
   self.__messy = 1

 def main(self):
  Threads = []
  # 將會(huì)啟動(dòng)10個(gè)線程,線程id為 1 時(shí)全部線程終止!
  for i in range(10):
   t = threading.Thread(target=self.m,args=(i,))
   t.daemon = 1
   Threads.append(t)
  # 啟動(dòng)所有線程
  for i in Threads:
   i.start()
  # 當(dāng)標(biāo)志位【 messy 】時(shí)所有多線程結(jié)束
  while 1:
   if self.__messy:
    break
  print('線程已退出!')

Messy().main()
# 繼續(xù)執(zhí)行后續(xù)程序
for i in range(5):
 print('yeah!')

此時(shí),main這個(gè)函數(shù)對(duì)于多線程來(lái)講,便是父進(jìn)程,也就是守護(hù)進(jìn)程。預(yù)計(jì)會(huì)進(jìn)行10次循環(huán)的數(shù)字打印,但是當(dāng)self.__messy這個(gè)標(biāo)志位為真時(shí),所有的剩余子線程將不會(huì)再執(zhí)行,直接結(jié)束進(jìn)行后續(xù)的操作

e.g:如下圖便只打印了四次

最后

目前來(lái)講,用設(shè)置主線程退出的方法是可以完成現(xiàn)在這個(gè)搶票的目標(biāo)。

但是后來(lái)發(fā)現(xiàn)其實(shí)這么做也會(huì)帶來(lái)很多壞處,直接殺掉所有子線程對(duì)系統(tǒng)來(lái)說(shuō)是一個(gè)很粗魯?shù)男袨?,如果涉及到的操作包括?code>文件數(shù)據(jù)、數(shù)據(jù)庫(kù)數(shù)據(jù)的改動(dòng)的話,內(nèi)存無(wú)法被合理釋放(之前就遇到過(guò)CPU莫名占用滿),極有可能造成數(shù)據(jù)丟失甚至系統(tǒng)中斷

我這里只是一個(gè)搶票的小程序,子線程只用到了POST,網(wǎng)絡(luò)請(qǐng)求中斷帶來(lái)的影響還是相對(duì)來(lái)講比較小的,所以大家酌情使用本篇所介紹的方法。

本文作者: Messy
原文鏈接:https://www.messys.top/detail/78

到此這篇關(guān)于Python多線程的退出控制實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python多線程退出控制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python如何拆分含有多種分隔符的字符串

    Python如何拆分含有多種分隔符的字符串

    這篇文章主要介紹了Python如何拆分含有多種分隔符的字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • Keras中Sequential模型和Functional模型的區(qū)別及說(shuō)明

    Keras中Sequential模型和Functional模型的區(qū)別及說(shuō)明

    這篇文章主要介紹了Keras中Sequential模型和Functional模型的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Tensorflow深度學(xué)習(xí)使用CNN分類(lèi)英文文本

    Tensorflow深度學(xué)習(xí)使用CNN分類(lèi)英文文本

    這篇文章主要為大家介紹了Tensorflow深度學(xué)習(xí)CNN實(shí)現(xiàn)英文文本分類(lèi)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • GCN?圖神經(jīng)網(wǎng)絡(luò)使用詳解?可視化?Pytorch

    GCN?圖神經(jīng)網(wǎng)絡(luò)使用詳解?可視化?Pytorch

    這篇文章主要介紹了GCN?圖神經(jīng)網(wǎng)絡(luò)使用詳解?可視化?Pytorch,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python文件處理fileinput使用方法詳解

    python文件處理fileinput使用方法詳解

    這篇文章主要介紹了python文件處理fileinput使用方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Python實(shí)現(xiàn)腳本轉(zhuǎn)換為命令行程序

    Python實(shí)現(xiàn)腳本轉(zhuǎn)換為命令行程序

    使用Python中的scaffold和click庫(kù),你可以將一個(gè)簡(jiǎn)單的實(shí)用程序升級(jí)為一個(gè)成熟的命令行界面工具,本文就來(lái)帶你看看具體實(shí)現(xiàn)方法,感興趣的可以了解下
    2022-09-09
  • Python 讀取 YUV(NV12) 視頻文件實(shí)例

    Python 讀取 YUV(NV12) 視頻文件實(shí)例

    今天小編就為大家分享一篇Python 讀取 YUV(NV12) 視頻文件實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-12-12
  • Python中的yield淺析

    Python中的yield淺析

    這篇文章主要介紹了Python中的yield淺析,對(duì)迭代器(iterator) 、生成器(constructor)一并做了分析,并用實(shí)例來(lái)說(shuō)明,需要的朋友可以參考下
    2014-06-06
  • Python之多進(jìn)程與多線程的使用

    Python之多進(jìn)程與多線程的使用

    這篇文章主要介紹了Python之多進(jìn)程與多線程的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python中NumPy的數(shù)組重塑

    Python中NumPy的數(shù)組重塑

    這篇文章主要介紹了Python中NumPy的數(shù)組重塑,Numpy是Python科學(xué)計(jì)算庫(kù),用于快速處理任意維度的數(shù)組,NumPy使用c語(yǔ)言寫(xiě)的,底部解除了GIL,其對(duì)數(shù)組的操作速度不在受python解釋器限制<BR>
    2023-07-07

最新評(píng)論

赤峰市| 万州区| 镇赉县| 泰州市| 宜君县| 铁岭市| 广平县| 平阳县| 罗江县| 宁强县| 江津市| 香格里拉县| 新龙县| 德昌县| 南京市| 汝阳县| 老河口市| 宾川县| 琼海市| 利川市| 林口县| 灵丘县| 武安市| 和田县| 沙洋县| 二连浩特市| 广饶县| 长治市| 襄城县| 滦平县| 肇州县| 深圳市| 宜兴市| 万载县| 杂多县| 灵宝市| 漳州市| 陇川县| 荔浦县| 台南县| 突泉县|