簡體   English   中英

如何在Python中停止后台線程

[英]How to stop background thread in Python

以下是用於說明目的的代碼段。 C1.infinite_loop()方法作為后台線程運行。 我想確定是否有人按下Ctrl + C然后優雅地終止程序。 我需要覆蓋什么方法以及在哪里處理Ctrl + C信號? 我想在生成Ctrl + C時設置一個標志,並定期檢查C1.infinite_loop。 如果flag為true則退出循環? 這是正確的方法還是你建議別的嗎?

import time
import random
from threading import Thread

class C1:
   def __init__(self):
     self.list = list()

   def infinite_loop(self):
     while True:
       self.list.append(random.randint(1,10))
       time.sleep(2)

class C2:
   def __init__(self):
       print('inside C2 init')
       self.c1 = C1()
   def main(self):
      self.bg_th = Thread(target=self.c1.infinite_loop)
      self.bg_th.start()
   def disp(self):
      print(self.c1.list)

c2 = C2()
c2.main()
time.sleep(2)
c2.disp()
c2.bg_th.join()

還有一個問題。 列表在這里的兩個線程之間共享。 C2正在讀取,C1正在寫入。 在這種情況下我還需要使用鎖嗎?

這使用標志和信號來終止無限循環

#!/usr/bin/env python
import signal
import sys

import time
import random
from threading import Thread

class C1:
   def __init__(self):
      signal.signal(signal.SIGINT,self.signal_handler)
      self.keepgoing = True
      self.list = list()

   def infinite_loop(self):
      while self.keepgoing:
         self.list.append(random.randint(1,10))
         time.sleep(2)

   def signal_handler(self, sig, frame):
       print('You pressed Ctrl+C!')
       self.keepgoing = False

class C2:
   def __init__(self):
      print('inside C2 init')
      self.c1 = C1()

   def main(self):
      self.bg_th = Thread(target=self.c1.infinite_loop)
      self.bg_th.start()

   def disp(self):
      print(self.c1.list)



c2 = C2()
c2.main()
time.sleep(2)
c2.disp()
c2.bg_th.join()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM