我想知道如何使用CTRL + C或類似的方法在控制檯中停止我的程序。 問題是我的程序中有兩個線程。線程抓取Web並提取一些數據,並且線程2以可讀格式爲用戶顯示此數據。兩部分共享相同的數據庫。我這樣運行它們:Python如何停止線程操作
from threading import Thread
import ResultsPresenter
def runSpider():
Thread(target=initSpider).start()
Thread(target=ResultsPresenter.runPresenter).start()
if __name__ == "__main__":
runSpider()
我該怎麼做?
好了,所以我創建了自己的線程類:
import threading
class MyThread(threading.Thread):
"""Thread class with a stop() method. The thread itself has to check
regularly for the stopped() condition."""
def __init__(self):
super(MyThread, self).__init__()
self._stop = threading.Event()
def stop(self):
self._stop.set()
def stopped(self):
return self._stop.isSet()
行,所以我會在這裏發佈resultPresenter和履帶式的片段。 這裏是resultPresenter的代碼:
# configuration
DEBUG = False
DATABASE = database.__path__[0] + '/database.db'
app = Flask(__name__)
app.config.from_object(__name__)
app.config.from_envvar('CRAWLER_SETTINGS', silent=True)
def runPresenter():
url = "http://127.0.0.1:5000"
webbrowser.open_new(url)
app.run()
也有此兩種方法,我省略了 - 他們中的一個連接到數據庫,第二種方法加載HTML模板來顯示結果。我重複這一點,直到條件滿足或用戶停止該程序(我試圖實現)。還有兩個其他方法 - 一個是從命令行獲得的初始鏈接,另一個是第二個參數 - 如果參數無效,我將不運行crawl()方法。
這裏是履帶式的短版:
def crawl(initialLink, maxDepth):
#here I am setting initial values, lists etc
while not(depth >= maxDepth or len(pagesToCrawl) <= 0):
#this is the main loop that stops when certain depth is
#reached or there is nothing to crawl
#Here I am popping urls from url queue, parse them and
#insert interesting data into the database
parser.close()
sock.close()
dataManager.closeConnection()
這裏是初始化文件,開始在線程這些模塊:
import ResultsPresenter, MyThread, time, threading
def runSpider():
MyThread.MyThread(target=initSpider).start()
MyThread.MyThread(target=ResultsPresenter.runPresenter).start()
def initSpider():
import Crawler
import database.__init__
import schemas.__init__
import static.__init__
import templates.__init__
link, maxDepth = Crawler.getInitialLink()
if link:
Crawler.crawl(link, maxDepth)
killall = False
if __name__ == "__main__":
global killall
runSpider()
while True:
try:
time.sleep(1)
except:
for thread in threading.enumerate():
thread.stop()
killall = True
raise
這似乎是我正在尋找的解決方案,但我仍然不知道如何攔截來自命令行的信號以及如何阻止這兩種方式代碼中的ds。你能舉一些例子嗎?無論如何謝謝 – koleS
這將工作。 'try:except:'沒有指定'Exception'的塊實際上會捕獲異常異常(如CTRL + C)。這就是爲什麼我要「睡覺」(它什麼都不做,但我們希望不斷檢查)。至於停止線程:這取決於它們如何實現。 :) – freakish
實際上它不工作 - 推CTRL + C鍵後,引發KeyInterrupt,但兩個模塊仍在運行。順便說一句。當你應用於變量時,你能解釋'全局'的含義嗎?它是由我的數據包中的所有模塊看到的還是什麼? – koleS