欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

日常前言

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

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

單線程的結(jié)束

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


但是百度這一次卻不盡人意,搜了很久,結(jié)果不盡人意,基本上所有的搜索結(jié)果都告訴我只有結(jié)束單個線程的方法,我也試過循環(huán)使用百度的結(jié)束函數(shù),但最終都只能是結(jié)束的當(dāng)前的這一個線程,無法達(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é)束多個線程呢?

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

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ìn)行打印
  time.sleep(random.random()*2)
  print(i)
  if i == 1:
   self.__messy = 1

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

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

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

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

最后

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

但是后來發(fā)現(xiàn)其實這么做也會帶來很多壞處,直接殺掉所有子線程對系統(tǒng)來說是一個很粗魯?shù)男袨椋绻婕暗降牟僮靼?code>文件數(shù)據(jù)、數(shù)據(jù)庫數(shù)據(jù)的改動的話,內(nèi)存無法被合理釋放(之前就遇到過CPU莫名占用滿),極有可能造成數(shù)據(jù)丟失甚至系統(tǒng)中斷

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

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

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

相關(guān)文章

  • numpy數(shù)據(jù)類型dtype轉(zhuǎn)換實現(xiàn)

    numpy數(shù)據(jù)類型dtype轉(zhuǎn)換實現(xiàn)

    這篇文章主要介紹了numpy數(shù)據(jù)類型dtype轉(zhuǎn)換實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • 只需要這一行代碼就能讓python計算速度提高十倍

    只需要這一行代碼就能讓python計算速度提高十倍

    今天教大家一個小方法,只需要這一行代碼就能讓python計算速度提高十倍,文中介紹的非常詳細(xì),對正在學(xué)習(xí)python的小伙伴有很好的幫助,需要的朋友可以參考下
    2021-05-05
  • python使用循環(huán)實現(xiàn)批量創(chuàng)建文件夾示例

    python使用循環(huán)實現(xiàn)批量創(chuàng)建文件夾示例

    這篇文章主要介紹了python使用循環(huán)實現(xiàn)批量創(chuàng)建文件夾示例,需要的朋友可以參考下
    2014-03-03
  • Python中如何使用Matplotlib庫繪制圖形

    Python中如何使用Matplotlib庫繪制圖形

    Matplotlib是一個Python的2D繪圖庫,通過Matplotlib開發(fā)者可以僅需要幾行代碼,便可以生成繪圖,直方圖,功率譜,條形圖,錯誤圖,散點圖等,這篇文章主要給大家介紹了Python中如何使用Matplotlib庫繪制圖形的相關(guān)資料
    2022-07-07
  • 寫一個Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻

    寫一個Python腳本下載嗶哩嗶哩舞蹈區(qū)的所有視頻

    B 站大家都熟悉,尤其是它的舞蹈區(qū).有 100W+ 的舞蹈視頻.在沒有 wifi 的情況下,就欣賞不了這些視頻了.作為一個 python 程序員,小編就寫一個 Python 腳本在晚上下載舞蹈區(qū)的所有視頻,需要的朋友可以參考下
    2021-05-05
  • Django配置文件代碼說明

    Django配置文件代碼說明

    在本篇文章里小編給大家整理了關(guān)于Django配置文件代碼說明知識點,有需要的朋友們學(xué)習(xí)下。
    2019-12-12
  • python 中的列表解析和生成表達(dá)式

    python 中的列表解析和生成表達(dá)式

    優(yōu)雅、清晰和務(wù)實都是python的核心價值觀,如果想通過操作和處理一個序列(或其他的可迭代對象)來創(chuàng)建一個新的列表時可以使用列表解析( List comprehensions)和生成表達(dá)式,通過這兩個操作,我們可以看到這三個觀點是如何在python中和諧統(tǒng)一起來的。
    2011-03-03
  • 如何利用python多線程爬取天氣網(wǎng)站圖片并保存

    如何利用python多線程爬取天氣網(wǎng)站圖片并保存

    最近做個天 氣方面的APP需要用到一些天氣數(shù)據(jù),所以下面這篇文章主要給大家介紹了關(guān)于如何利用python多線程爬取天氣網(wǎng)站圖片并保存的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • 樹莓派中python獲取GY-85九軸模塊信息示例

    樹莓派中python獲取GY-85九軸模塊信息示例

    本文內(nèi)容是樹莓派中python獲取GY-85九軸模塊信息的示例,這里使用Python的curses包開發(fā)cli窗口程序,用來實時刷新傳感器的讀數(shù),下面看代碼
    2013-12-12
  • pytorch cuda上tensor的定義 以及減少cpu的操作詳解

    pytorch cuda上tensor的定義 以及減少cpu的操作詳解

    這篇文章主要介紹了pytorch cuda上tensor的定義 以及減少cpu的操作詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06

最新評論