[Tutor] How to kill a thread

CMG Thrissur cmgcomsol at gmail.com
Sun Nov 22 11:10:13 EST 2015



On Sunday 22 November 2015 05:24 PM, Laura Creighton wrote:
> In a message of Sun, 22 Nov 2015 11:23:58 +0530, CMG Thrissur writes:
>> Hello, I have seen some examples of terminating a thread the safe 
>> way. But is there a way to kill a thread without worrying about what 
>> happens next. Like thread.stop() or something George
> import sys sys.exit(1) This will brutally kill the whole process. 
> Sometimes that is what you want. Most of the time, it isn't. Python 
> doesn't have a way to grab a thread and kill it, it can only ask it to 
> please stop themselves. Laura

Thank you Steven and Laura for your reply.  I was testing some urls with 
pythonwhois, and i got stuck with some threads taking longer than 
expected time, i found a roundabout way for it. Below is my code, do you 
suggest any improvements:

import datetime import time import mysql.connector import threading 
import pythonwhois cnx = 
mysql.connector.connect(user='root',password=pas,host='localhost',database=db) 
cursor = cnx.cursor() def ProcessList(domain:str): ''' :paramdomain:din, 
dcom etc :return: ''' query='select url from urls where (%s="" or 
%s<curdate()) and %s<curdate()-1'%(domain,domain,domain+'lastcheck') 
print (query) cursor.execute(query) tmplist=[] for url in cursor: 
tmplist.append(url[0]) return tmplist #print (ProcessList('din')) class 
DomainUrlValidityChecker(threading.Thread): def 
__init__(self,domain:str,urllist:list): threading.Thread.__init__(self) 
print ("Starting",self.name) self.domain=domain self.urllist=urllist 
self.time=datetime.datetime.now() def run(self): for url in 
self.urllist: workurl = url + '.' + self.domain result = 
pythonwhois.get_whois(workurl) if result.get('expiration_date', None) != 
None: #print(workurl, result['expiration_date'][0].date().isoformat()) 
#print(result['expiration_date'][0].year) query="update urls set 
d%s='%s',d%s=curdate() where 
url='%s';"%(self.domain,result['expiration_date'][0].date().isoformat(),self.domain+'lastcheck',url) 
print(query) cnx = 
mysql.connector.connect(user='root',password=pas,host='localhost',database=db) 
cursor = cnx.cursor() cursor.execute(query) cnx.commit() else: 
#print('Available', workurl) query="update urls set d%s='',d%s=curdate() 
where url='%s';"%(self.domain,self.domain+'lastcheck',url) print(query) 
cnx = 
mysql.connector.connect(user='root',password=pas,host='localhost',database=db) 
cursor = cnx.cursor() cursor.execute(query) cnx.commit() print 
("Ending",self.name) class Sleeper(threading.Thread): def 
__init__(self,sleepcounter): threading.Thread.__init__(self) 
self.sleepinterval=sleepcounter def run(self): 
time.sleep(self.sleepinterval) if __name__=="__main__": 
urllist=ProcessList('dus') #specifying domain table column print 
(urllist) counter=0 tdic={} runcounter=10000 while runcounter>0: print 
('loop',runcounter,'total count',len(threading.enumerate()),'total of 
value', len(tdic.keys()),datetime.datetime.now().time()) if 
len(tdic.keys())<10: #changed to consider on keys while 
len(tdic.keys())<10: # same as above wlist=urllist[counter:counter+10] 
print ('for new thread pass list',wlist) 
tdic[counter]=DomainUrlValidityChecker('us',wlist) #specifying actual 
domain tdic[counter].start() counter+=10 else: 
tmpitems=list(tdic.keys()) for item in tmpitems: #print(tdic[item].name) 
if tdic[item].isAlive()==False: print ('deleting 
dead',item,tdic[item].name) del tdic[item] continue if 
(datetime.datetime.now()-tdic[item].time).total_seconds()>30: print 
('deleting long overdue ',item,tdic[item].name) del tdic[item] for item 
in tdic.keys(): print (tdic[item].name) print ("sleeping") 
slth=Sleeper(10) slth.start() slth.join() print ('awake') runcounter-=1


Thanks

George


More information about the Tutor mailing list