[Tutor] How to kill a thread

CMG Thrissur cmgcomsol at gmail.com
Sun Nov 22 20:42:29 EST 2015



On Monday 23 November 2015 12:12 AM, Laura Creighton wrote:
> 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
Is the below text in plain text? I am using thunderbird.


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













Thanks
George


More information about the Tutor mailing list