[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