python線程終止
❶ python中如何在一段時間後停止程序
用到threading的Timer,也類似單片機那樣子,在中斷程序中再重置定時器,設置中斷,python實例代碼如下:
import threading
import time
def change_user():
print('這是中斷,切換賬號')
t = threading.Timer(3, change_user)
t.start()
#每過3秒切換一次賬號
t = threading.Timer(3, change_user)
t.start()
while True:
print('我在爬數據')
time.sleep(1)
(1)python線程終止擴展閱讀
有時當一個條件成立的情況下,需要終止程序,可以使用sys.exit()退出程序。sys.exit()會引發一個異常:
1、如果這個異常沒有被捕獲,那麼python編譯器將會退出,後面的程序將不會執行。
2、如果這個異常被捕獲(try...except...finally),捕獲這個異常可以做一些額外的清理工作,後面的程序還會繼續執行。
註:0為正常退出,其他數值(1-127)為不正常,可拋異常事件供捕獲。另一種終止程序的方法os._exit()
一般情況下使用sys.exit()即可,一般在fork出來的子進程中使用os._exit()
採用sys.exit(0)正常終止程序,程序終止後shell運行不受影響。
採用os._exit(0)關閉整個shell,調用sys._exit(0)後整個shell都重啟了(RESTART Shell)。
❷ Python里如何終止一個線程
Python用sleep停止一個線程的運行,而不影響主線程的運行,案例代碼如下:
fromthreadingimport*
importtime
classMyThread(Thread):
defrun(self):
self.ifdo=True;
whileself.ifdo:
print'Iamrunning...'
time.sleep(2)
defstop(self):
print'Iamstoppingit...'
self.ifdo=False;
tr=MyThread()
tr.setDaemon(True)
tr.start()
print'Iwillstopit...'
time.sleep(5)
tr.stop()
tr.join()
❸ Python中怎麼在終止一個線程的同時終止另外一個線程
設置一個全局變數,初值為False
設置鍵盤監聽事件,當監測到特定按鍵時,將全局變數的值修改為True
在每個子線程中,循環檢測全局變數的值,當檢測到值為True時退出線程函數。
❹ Python ThreadPoolExecutor 異常中止解決方案
通常情況,我們利用 Ctrl+C 讓程序觸發 KeyboardInterrupt 異常,中止程序運行。線程池方案下, Ctrl-C 失效,當線程池裡的線程任務跑完後,才會觸發 KeyboardInterrupt 。
上下文管理協議相當於隱性地省略了 threadPool.shutdown(wait=True) ,同時,程序正常執行完成或出現異常中斷的時候,就會調用 __exit__() 方法,接下來進行異常中止的基礎。
適用於 Django 等 WEB 應用框架,本身自帶多線程,修改全局變數簡單,但要注意線程安全。
程序運行中,只需 sign = 1 或者 exiting.set() ,worker 函數則跳過主要運算部分,剩餘線程任務將迅速完成,變相達到中止多線程任務的目的。
提交給線程池的每個線程任務 task 加入 threadPool 中,方便後續對 task 進行操作。當 for 循環內的 task 全部提交後,線程會再後台運行,而進程運行至 while 中堵塞,直至 threadPool 中最後一個線程是否 .done() 。若進程堵塞在 while 中接收到 Ctrl+C 的 KeyboardInterrupt 異常,則從後往前取消 threadPool 中所有任務,達到中止目的。
❺ python里怎麼終止程序的執行
quit() exit()
執行到此命令時,程序終止。
如果是程序陷入死循環,想強制結束,則按Ctrl + C。這個特別關鍵。
Python的設計哲學是「優雅」、「明確」、「簡單」。因此,Perl語言中「總是有多種方法來做同一件事」的理念在Python開發者中通常是難以忍受的。Python開發者的哲學是「用一種方法,最好是只有一種方法來做一件事」。
在設計Python語言時,如果面臨多種選擇,Python開發者一般會拒絕花俏的語法,而選擇明確的沒有或者很少有歧義的語法。由於這種設計觀念的差異,Python源代碼通常被認為比Perl具備更好的可讀性,並且能夠支撐大規模的軟體開發。這些准則被稱為Python格言。在Python解釋器內運行import this可以獲得完整的列表。
擴展質料:
Python在執行時,首先會將.py文件中的源代碼編譯成Python的byte code(位元組碼),然後再由Python Virtual Machine(Python虛擬機)來執行這些編譯好的byte code。這種機制的基本思想跟Java,.NET是一致的。
然而,Python Virtual Machine與Java或.NET的Virtual Machine不同的是,Python的Virtual Machine是一種更高級的Virtual Machine。這里的高級並不是通常意義上的高級,不是說Python的Virtual Machine比Java或.NET的功能更強大。
而是說和Java 或.NET相比,Python的Virtual Machine距離真實機器的距離更遠。或者可以這么說,Python的Virtual Machine是一種抽象層次更高的Virtual Machine。
基於C的Python編譯出的位元組碼文件,通常是.pyc格式。
除此之外,Python還可以以交互模式運行,比如主流操作系統Unix/Linux、Mac、Windows都可以直接在命令模式下直接運行Python交互環境。直接下達操作指令即可實現交互操作。
參考資料:Python-網路
❻ python pyqt5在使用多線程時自動退出是怎麼回事
線程只執行一次……讓我來猜一猜。
你可能會認為創建一個線程去執行某個動作就完事了?
一段代碼不管是在主線程里還是在新建的線程里,它都是按代碼本身的規則那麼執行的,該循環就循環,該結束就結束。
所以,我們建立一個線程去執行某個動作,主要就是讓這個動作的執行不影響主程的執行,不要因為它導致主程序的某環節等待這個動作的結果。
舉例來說,一個定時3秒去讀一下某個文件,總不能做個循環,讀一下文件,然後sleep3秒吧,那除了這個,什麼也幹不了,基本都是在【等待3秒】這里耗著了。解決辦法就是做個線程去完成【讀某個文件】,然後這個事完了之後、前再建一個同樣的線程讓它三秒後執行。
看下圖:
這個sort_loop就是這樣乾的:
【紅框2】就是主要的工作內容(對self.data進行收縮)
如果簡簡單單的就這,那它就執行一次就完事了,哪怕你把sort_loop放到新線程里,也是一樣。
要在sort_loop里再新建一個線程,新線程還是執行sort_loop,於是就是這樣的:
A把桌子擦了擦,把抹布塞給了B;
B把桌子擦了擦,把抹布塞給了C;
C把桌子擦了擦,把抹布塞給了D...
這才構成一個線程循環。