当一个线程失败时,终止多线程代码的正确方法是什么?

2024-10-01 15:45:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码:

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 !

将终止所有现有线程。以后不会创建线程(终止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时,这并没有关闭整个进程和线程。。我还有一些剩下的,作为僵尸留在那里。你知道吗

我的问题: 有没有一个简单,干净的解决方案来终止程序的错误通知?你知道吗


Tags: 代码inselffordataifaspage
1条回答
网友
1楼 · 发布于 2024-10-01 15:45:02

sys.exit()有时会卡住,因为它试图优雅地退出。你知道吗

一些快速而肮脏的解决方案意味着使用os._exit(1)(1可能是表示错误的返回代码,0表示成功,您不想在这里使用它)。保持在0-255范围内以避免便携性问题)

在现代系统中,资源跟踪发生,程序退出,杀死所有附加的资源(文件句柄、线程、内存…),因此这是一个可接受的解决方案。你知道吗

缺点是它绕过了python退出/清理过程,就像使用kill杀死python进程一样。在缺乏资源跟踪管理的操作系统上(我们谈论的是古代历史),这将导致全局内存泄漏/文件描述符。你知道吗

在你的情况下,这并不重要,因为没有这个你就不能退出你的申请。但不要一概而论,把它留给紧急出口程序。你知道吗

相关问题 更多 >

    热门问题