线程中的异常处理

线程中的异常处理

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()

复制代码
相关推荐
科技研学社4 分钟前
服装厂激光开袋机与智能模板机怎么选?核心工序设备深度对比与落地实战
数据库·python
心中有你02144 分钟前
C 语言文件操作详解:从写入、追加到读取与定位的完整 实战
c语言·开发语言
小张成长计划..16 分钟前
【Linux】26:线程互斥和同步
java·开发语言
张张123y4 小时前
后端第十四课:Agent 记忆系统(让 Agent 记住上下文和用户,跨会话不健忘)
java·大数据·人工智能·python·agent·记忆
阿里嘎多学长8 小时前
2026-10-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
happylifetree9 小时前
Python67:核心语法-函数进阶-参数类型(函数作为参数)
python
布吉岛的石头9 小时前
Java 程序员第 50 阶段2:预训练的目标函数:自回归语言建模本质
java·开发语言·人工智能·深度学习·回归·transformer
小羊没烦恼!9 小时前
铁道部新客票系统设计(二)
开发语言·前端·数据库·python·oracle·c#·php
quantdash_cc10 小时前
从实时行情到价格观察表:用 Python 和 Pandas 构建策略输入数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
镜子AI10 小时前
镜子AI工程实践:用 Python 做 GEO 实体一致性审计,并自动生成 JSON-LD 结构化数据
人工智能·python·json