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 Georgeimport 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. LauraThank 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 GeorgeYour 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 _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor