线程中的异常处理

线程中的异常处理

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

复制代码
相关推荐
杏花春雨江南2 分钟前
Spring Cloud Gateway 作为一个独立的服务进行部署吗
java·开发语言
GSDjisidi3 分钟前
东京本社招聘 | 财务负责人 & 多个日本IT岗位(Java/C++/Python/AWS 等),IT营业同步招募
java·开发语言·aws
skywalk81634 分钟前
copyparty 是一款使用单个 Python 文件实现的内网文件共享工具,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景
开发语言·python
BYSJMG9 分钟前
计算机毕设选题:基于Python+MySQL校园美食推荐系统【源码+文档+调试】
大数据·开发语言·python·mysql·django·课程设计·美食
Zz_waiting.14 分钟前
案例开发 - 日程管理 - 第七期
开发语言·前端·javascript·vue.js·html·路由
writeone14 分钟前
9-10关于JS初学产生的问题
开发语言·javascript·ecmascript
索迪迈科技1 小时前
Flink Task线程处理模型:Mailbox
java·大数据·开发语言·数据结构·算法·flink
太阳的后裔2 小时前
随笔一些用C#封装的控件
开发语言·c#
tianyuanwo2 小时前
Rust语言组件RPM包编译原理与Cargo工具详解
开发语言·网络·rust·rpm
CodeCraft Studio7 小时前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64
开发语言·python·pdf·base64·aspose·aspose.pdf