thread = threading.Thread(target=self.threading_run);
thread.start()
pass
def threading_run_s(self):
print("-----------****************++++++++")
print(url)
for xb in range(10):
print(xb)
output.Output(str(xb))
time.sleep(10)
python 沒有現(xiàn)成的方法可以強制結束線程,建議改用 multiprocessing 模塊。
強制結束線程可通過 ctypes 調(diào)用系統(tǒng) API 實現(xiàn),以 windows 系統(tǒng)為例,如下
# -*- coding: utf-8 -*-
import threading
import time
from datetime import datetime
def term_thread(thread_id):
# 強制結束線程
import os
if os.name == "nt":
# windows 系統(tǒng)
# 注意:線程結束后 threading.Thread 沒有任何提示。
import ctypes
h = ctypes.windll.kernel32.OpenThread(1, 0, thread_id)
assert h != 0
r = ctypes.windll.kernel32.TerminateThread(h, 0xff)
assert r != 0
else:
# TODO
raise NotImplementedError
def run_thread():
while 1:
time.sleep(1)
print('{}'.format(datetime.now()))
def main():
t = threading.Thread(target=run_thread)
t.start()
time.sleep(3)
term_thread(t.ident)
# 強制結束線程導致 join() 永遠不會返回
# t.join()
if __name__ == '__main__':
main()Python的threading類沒有提供退出方法,退出方法需要自己實現(xiàn).
這涉及到兩個問題:
threading提供了Event這個類,實際上這個類就是一個信號,可以比較方便的實現(xiàn)線程間通信.因為多線程運行在一個進程中,也可以自己定義一個類來傳遞信號.略過不表.
# coding:utf-8
import threading
import time
signal = threading.Event() # 定義一個信號
def worker(signal, *args, **kwargs):
"""子線程核心函數(shù)
Arguments:
signal {threading.Event} -- 接收的信號
"""
# 如果信號為False,則執(zhí)行任務
while not signal.isSet():
# 執(zhí)行工作
print("working")
time.sleep(1)
print("exiting")
# 信號為True時,退出子線程
exit()
t = threading.Thread(target=worker, args=(signal,))
t.start()
time.sleep(2)
print(u"發(fā)送退出信號")
signal.set()
time.sleep(1.5)
print(u"當前子線程的狀態(tài)為{}".format(t.isAlive()))
time.sleep(1)
輸出
working
working
發(fā)送退出信號
exiting
當前子線程的狀態(tài)為False
在子線程內(nèi)部調(diào)用exit(),是退出子線程而不是退出主線程,調(diào)用位置的問題.
退出線程有很多辦法,不過核心就是判斷信號的狀態(tài).這就需要在worker流程控制中加好判斷點位.要明確退出不是指令發(fā)出去立刻就會執(zhí)行,而是處理信號的代碼發(fā)現(xiàn)了信號改變才會停止worker,這個是需要自己實現(xiàn)的.
比如上方代碼在signal.isSet()發(fā)生改變之后,跳出了while循環(huán),實際上worker已經(jīng)結束了,exit方法是為了增加可讀性的,完全沒必要加.
通過任何方法結束線程都可以,運行完畢或者手動exit都可以
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質(zhì)雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據(jù)專業(yè)的國家
達內(nèi)教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產(chǎn)業(yè)為響應國家深化產(chǎn)教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產(chǎn)業(yè)鏈。利用北京大學優(yōu)質(zhì)教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經(jīng)理從事移動互聯(lián)網(wǎng)管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經(jīng)理職務負責iOS教學及管理工作。
浪潮集團項目經(jīng)理。精通Java與.NET 技術, 熟練的跨平臺面向?qū)ο箝_發(fā)經(jīng)驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網(wǎng)頁制作和網(wǎng)頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經(jīng)驗。曾經(jīng)歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。