线程中的异常处理

线程中的异常处理

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

复制代码
相关推荐
Andy10 分钟前
Python基础语法4
开发语言·python
但要及时清醒15 分钟前
ArrayList和LinkedList
java·开发语言
孚亭31 分钟前
Swift添加字体到项目中
开发语言·ios·swift
hweiyu0035 分钟前
Go、DevOps运维开发实战(视频教程)
开发语言·golang·运维开发
mm-q29152227291 小时前
Python+Requests零基础系统掌握接口自动化测试
开发语言·python
星星火柴9361 小时前
笔记 | C++面向对象高级开发
开发语言·c++·笔记·学习
码界奇点1 小时前
Rust 性能优化全流程从 flamegraph 定位瓶颈到 unsafe 与 SIMD 加速响应快
开发语言·性能优化·rust·simulated annealing
电院工程师2 小时前
SIMON64/128算法Verilog流水线实现(附Python实现)
python·嵌入式硬件·算法·密码学
丛雨要玩游戏2 小时前
字符函数和字符串函数
c语言·开发语言·算法