[Tutor] How to kill a thread

Laura Creighton lac at openend.se
Sun Nov 22 13:42:59 EST 2015


In a message of Sun, 22 Nov 2015 21:40:13 +0530, CMG Thrissur writes:
>
>
>
>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

Your editor or mail program is trying to do the favour of flowing
yours and other people's text.  Usually you can get your mailer to
stop doing this by specifying your mail as 'plain text' but not
always -- I hear that Google mail will insist on flowing if you 
are on a mobile device no matter what.

Since spacing is significant in python, there is no way we
can tell what it is your code is doing until you get gmail to
behave. 

Laura


More information about the Tutor mailing list