线程中的异常处理

线程中的异常处理

concurrent.futures --- 启动并行任务 --- Python 3.13.0 文档

py 复制代码
from concurrent.futures import ThreadPoolExecutor

def task():
    a = 1 / 0
    print('任务执行中...')


with ThreadPoolExecutor(max_workers=5) as t:
    for i in range(10):
        worker = t.submit(task)

没有任任何打印, 有任务中的异常被吃掉了

打印线程中异常信息堆栈

py 复制代码
from concurrent.futures import ThreadPoolExecutor

def task():
    a = 1 / 0
    print('任务执行中...')


def callback(future):
    print('任务执行完毕')
    # 打印异常信息
    print(future.exception())  # division by zero
    # 打印异常信息堆栈
    future.result()


with ThreadPoolExecutor(max_workers=5) as t:
    for i in range(10):
        future = t.submit(task)
        future.add_done_callback(callback)

处理线程中执行的异常

py 复制代码
from concurrent.futures import ThreadPoolExecutor


def task():
    a = 1 / 0
    print('任务执行中...')


def callback(future):
    print('任务执行完毕')
    try:
        future.result()
    except Exception as e:
        print("处理线程中执行的异常", e)
        pass


with ThreadPoolExecutor(max_workers=5) as t:
    for i in range(10):
        future = t.submit(task)
        future.add_done_callback(callback)

根据线程任务返回结果判断是否继续新增线程

py 复制代码
from concurrent.futures import ThreadPoolExecutor


def task(pages):
    for page in pages:
        print('任务', page)
        # 假设 第33页是最后一页
        if page >= 33:
            return True


def main():
    with ThreadPoolExecutor(max_workers=10) as t:
        # 根据任务返回结果判断是否继续新增线程
        # 场景: 有个未知总页数的任务, 每次线程任务执行10页, 当任务返回结果为True时, 任务结束
        over = False
        page = 0
        jump = 10

        def callback(future):
            nonlocal over
            res = future.result()
            print('任务返回结果', res)
            if res:
                print("任务结束")
                over = True

        while not over:
            pages = list(range(page, page + jump))
            f = t.submit(task, pages)
            f.add_done_callback(callback)
            page += jump


if __name__ == '__main__':
    main()

多个参数的任务

py 复制代码
from concurrent.futures import ThreadPoolExecutor


def task(a, b):
    print(a, b)


def main():
    with ThreadPoolExecutor(max_workers=10) as t:
        for i in range(10):
            t.submit(task, i, i * i)


if __name__ == '__main__':
    main()

(max_workers=10) as t:

for i in range(10):

t.submit(task, i, i * i)

if name == 'main ':

main()

复制代码
相关推荐
天若有情6734 小时前
程序员原创|借鉴JS事件冒泡,根治电脑文件混乱的“冒泡整理法”
开发语言·javascript·windows·ecmascript·电脑·办公·日常
七颗糖很甜5 小时前
电离层对地基雷达测量精度的影响分析与校正方法
python
特种加菲猫5 小时前
继承,一场跨越时空的对话
开发语言·c++
AC赳赳老秦5 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
小熊Coding5 小时前
Python2D射击冒险闯关游戏2.0版本
python·pygame
FYKJ_20106 小时前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
玩转单片机与嵌入式6 小时前
玩转边缘AI(TInyML):需要掌握的C++知识汇总!
开发语言·c++·人工智能
茉莉玫瑰花茶6 小时前
Qt 信号与槽 [ 1 ]
开发语言·数据库·qt
yanghuashuiyue7 小时前
Deep Agents 框架-CLI
python·langchain·langgraph·deepagents