When i execute the following script i get outputs even after i pressed ctrl C or used interrupt in Pycharm which is the same as KeyboardInterrupt i think.
I have to press ctrl C three times to stop it. Why is shutdown(wait=False,cancel_futures=True)
not working?
` from concurrent.futures import ThreadPoolExecutor, as_completed
from datetime import datetime
import urllib3
import urllib.error as E
import time
urls = ["facebook.com","google.com"]
user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
def build_list(directory,url):
urllist = []
with open(directory) as file:
for line in file:
line = line.rstrip()
current_url = f"{url}/{line}"
urllist.append(current_url)
return urllist
def process_directories(request_url):
http = urllib3.PoolManager()
head = {"User-Agent": user_agent}
try:
response = http.request("GET", request_url, headers=head)
print(f"Status for {request_url}: {response.status}")
return response.status
except (E.URLError, E.HTTPError):
if hasattr(E.HTTPError, 'code') and E.HTTPError.code != 404:
print("!!!!! [{}] ==> {}".format(E.HTTPError.code, request_url))
pass
except Exception as e:
print(f"Unexpected error: {str(e)}")
def task(url):
urllist = build_list("../dirlist.txt", url)
print(f"Urllist Built For: {url}")
for url in urllist:
process_directories(url)
if __name__ == "__main__":
with ThreadPoolExecutor(max_workers=10) as pool:
futures = [
pool.submit(task, url) for url in urls
]
for future in futures:
print([f._state for f in futures])
if future.cancelled():
continue
try:
n = future.result()
print(f"{datetime.now()} - {n}")
except KeyboardInterrupt as e:
print(f"{datetime.now()} - EXCEPTION! {e}")
pool.shutdown(wait=False, cancel_futures=True)
print(f"{datetime.now()} - Run complete")`
I tried incorporating shutdown and Event both didnt work.
I want the script to shutdown all threads after KeyboardInterrupt
Thomas is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.