我有以下代码:
def getdata3(self, page, data, apifolder, additional):
tries = 10
for n in range(tries):
try:
except (ChunkedEncodingError, requests.exceptions.HTTPError) as e:
...
if n == tries - 1:
raise e # If arrived here - Terminate !
print ("{2} page {0} finished. Length is {1}".format(page,len(datarALL),str(datetime.now())))
return job
主要代码:
with ThreadPoolExecutor(max_workers=num_of_workers) as executor:
futh = [(executor.submit(self.getdata3, page, data, apifolder,additional)) for page in pages]
for data in as_completed(futh):
datarALL.extend(data.result())
print ("Finished generateing data.")
return datarALL
此代码为 worker 创建线程。当所有工作完成后,它返回 datarALL 。
我的问题:
我想要的是,如果其中一个线程到达这里:
if n == tries - 1:
raise e # If arrived here - Terminate !
所有存在的线程将被终止。不会创建 future 的线程(终止 for page in pages 循环)并且整个程序将终止。
我阅读了几篇关于这个问题的文章。我也读过这个Should I use Events, Semaphores, Locks, Conditions, or a combination thereof to manage safely exiting my multithreaded Python program?但提供的解决方案非常复杂,似乎添加了很多我怀疑我需要的代码。
我尝试过:
if n == tries - 1:
exit(1)
但是当我检查 htop 时,这并没有关闭整个进程和线程。我还剩下一些像僵尸一样留在那里。
我的问题: 是否有一个简单、干净的解决方案来终止程序并发出错误通知?
请您参考如下方法:
sys.exit() 有时会卡住,因为它试图正常退出。
一些快速而肮脏的解决方案意味着使用 os._exit(1)(1 是指示错误的可能返回代码,0 表示成功,您不想在这里使用它。保持在 0-255 范围内以避免便携性问题)
在现代系统上,资源跟踪发生并且程序退出,杀死所有附加资源(文件句柄、线程、内存...),因此这是一个可接受的解决方案。
缺点是它绕过了 python 退出/清理程序,就像您使用 kill 终止 python 进程一样。在缺乏资源跟踪管理的操作系统上(我们谈论的是古老的历史),这将导致全局内存泄漏/文件描述符。
在您的情况下,这无关紧要,因为没有它您将无法退出您的应用程序。但不要一概而论,保留用于紧急导出程序。
