中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python子線程退出及線程退出控制的代碼

發布時間:2020-09-18 06:27:01 來源:腳本之家 閱讀:291 作者:嗯啊哉 欄目:開發技術

下面通過代碼給大家介紹python子線程退出問題,具體內容如下所示:

def thread_func():
  while True:
      #do something
      #do something
      #do something
t=threading.Thread(target = thread_func)
t.start()
# main thread do something
# main thread do something
# main thread do something

跑起來是沒有問題的,但是使用ctrl + c中斷的時候出問題了,主線程退出了,但子線程仍然運行。

于是在主線程增加了信號處理的代碼,收到sigint時改變子線程循環條件

loop = True
def thread_func():
  while loop:
      #do something
      #do something
      #do something
t=threading.Thread(target = thread_func)
t.start()
# ctrl+c時,改變loop為False
def handler(signum, frame):
  global loop
  loop = False
  t.join()
  exit(0)
signal(SIGINT, handler)
# main thread do something
# main thread do something
# main thread do something

這樣ctrl+c就可以退出了,但是疑惑的是,主線程退出進程不會退出嗎?

知識點擴展Python線程退出控制

ctypes模塊控制線程退出

Python中threading模塊并沒有設計線程退出的機制,原因是不正常的線程退出可能會引發意想不到的后果。

例如:

線程正在持有一個必須正確釋放的關鍵資源,鎖。

線程創建的子線程,同時也將被殺掉。

管理自己的線程,最好的處理方式是擁有一個請求退出標志,這樣每個線程依據一定的時間間隔檢查規則,看是不是需要退出。

例如下面的代碼:

import threading
class StoppableThread(threading.Thread):
  """Thread class with a stop() method. The thread itself has to check
  regularly for the stopped() condition."""

  def __init__(self):
    super(StoppableThread, self).__init__()
    self._stop_event = threading.Event()

  def stop(self):
    self._stop_event.set()

  def stopped(self):
    return self._stop_event.is_set()

這段代碼里面,線程應該定期檢查停止標志,在退出的時候,可以調用stop()函數,并且使用join()函數來等待線程的退出。

然而,可能會出現確實想要殺掉線程的情況,例如你正在封裝一個外部庫,它會忙于長時間調用,而你想中斷它。

Python線程可以拋出異常來結束:

傳參分別是線程id號和退出標識

def _async_raise(tid, exctype):
  '''Raises an exception in the threads with id tid'''
  if not inspect.isclass(exctype):
    raise TypeError("Only types can be raised (not instances)")
  res = ctypes.pythonapi.PyThreadState_SetAsyncExc(tid,
                         ctypes.py_object(exctype))
  if res == 0:
    raise ValueError("invalid thread id")
  elif res != 1:
    # "if it returns a number greater than one, you're in trouble,
    # and you should call it again with exc=NULL to revert the effect"
    ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, 0)
    raise SystemError("PyThreadState_SetAsyncExc failed")

如果線程在python解釋器外運行時,它將不會捕獲中斷,即拋出異常后,不能對線程進行中斷。

簡化后,以上代碼可以應用在實際使用中來進行線程中斷,例如檢測到線程運行時常超過本身可以忍受的范圍。

def _async_raise(tid, exctype):
  """raises the exception, performs cleanup if needed"""
  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:
    # """if it returns a number greater than one, you're in trouble,
    # and you should call it again with exc=NULL to revert the effect"""
    ctypes.pythonapi.PyThreadState_SetAsyncExc(tid, None)
    raise SystemError("PyThreadState_SetAsyncExc failed")
def stop_thread(thread):
  _async_raise(thread.ident, SystemExit)

總結

以上所述是小編給大家介紹的python子線程退出及線程退出控制的代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

诸暨市| 尚义县| 邓州市| 呼伦贝尔市| 贺州市| 观塘区| 永平县| 毕节市| 巫山县| 汉寿县| 闽侯县| 福建省| 榆中县| 资溪县| 区。| 渑池县| 阳泉市| 马尔康县| 偃师市| 兴隆县| 南康市| 密云县| 会昌县| 禄丰县| 玉树县| 泰州市| 永川市| 霍城县| 嘉荫县| 大竹县| 塘沽区| 洛阳市| 呼玛县| 双牌县| 新干县| 万年县| 电白县| 滁州市| 锦州市| 阳曲县| 台江县|