所以我写了一些代码,当按下“STOP”按钮时会停止一个线程。它有效,但有一些警告。它倾向于将资源冻结一两秒,并且一旦按下它就会停止所有资源。我希望停止按钮一旦完成正在进行的操作就停止该线程。
这是我为停止事件创建的函数:
def Stop(self, event):
if myClass.worker != None:
if myClass.browser!=None:
while(myClass.browser.quit()!=None):
myClass.browser.quit()
myClass.worker.stop()
myClass.worker = None
while True:
try:
myfile = open(self.fpath, "r+")
myfile.close()
break
except IOError:
myClass.closeIt(self)
os.unlink(self.fpath)
os.rename(self.temp, self.fpath)
基本上如果没有生成线程(因此它不是None),它退出浏览器窗口然后停止从浏览器上的网页抓取信息的线程。然后它保存正在写入的文件。
实际停止的线程是我创建的openExcel类的一个实例:
myClass.worker = openExcel(temp)
此类的实例调用名为findDomains的函数:
def findDomains(self,searchrow, numrows, sheet, wbook):
for i in range(searchrow, numrows):
domain = sheet.cell_value(i, 2)
if domain == "":
company = sheet.cell_value(i, 1)
self.browser.get('https://www.google.com/')
wait = WebDriverWait(self.browser, 300)
inputGoogle=wait.until(EC.presence_of_element_located((By.NAME, "q")))
inputGoogle.clear()
inputGoogle.send_keys(company)
inputGoogle.submit()
self.browser.refresh()
tries = 0
while tries<1000:
try:
domain=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "cite._Rm")))
domain = domain.text
break
except StaleElementReferenceException:
tries+=1
self.browser.refresh()
domainlength=len(domain)
period=0
for charac in range(domainlength):
if domain[charac]==".":
period+=1
if period==1:
if "//" in domain:
domain = domain.split("//",1)[1]
index = domain.find("/")
domain = domain[:index]
elif period > 1:
domain = domain.split(".",1)[1]
index = domain.find("/")
domain = domain[:index]
checkdom=domain.split(".",1)[0]
if (checkdom+".") not in domain:
domain="error"
worksheet.write(i,2,domain)
wbook.save(file)
我不想停止它在此功能中所做的一切,而是希望停止功能等到“域”保存到Excel工作表中。 I.E.在尝试关闭浏览器并退出之前,它要完成它正在做的事情。