线程中的异常处理

线程中的异常处理

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

复制代码
相关推荐
qianbo_insist17 分钟前
c++ python 共享内存
开发语言·c++·python
今天背单词了吗98032 分钟前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题
CoderPractice38 分钟前
C#控制台小项目-飞行棋
开发语言·c#·小游戏·飞行棋
Coding小公仔1 小时前
LeetCode 151. 反转字符串中的单词
开发语言·c++·算法
程序猿阿伟1 小时前
《声音的变形记:Web Audio API的实时特效法则》
开发语言·前端·php
凌览1 小时前
有了 25k Star 的MediaCrawler爬虫库加持,三分钟搞定某红书、某音等平台爬取!
前端·后端·python
这里有鱼汤1 小时前
给你的DeepSeek装上实时行情,让他帮你炒股
后端·python·mcp
Humbunklung1 小时前
Rust方法语法:赋予结构体行为的力量
开发语言·后端·rust
萧曵 丶2 小时前
Rust 内存结构:深入解析
开发语言·后端·rust