150 lines
3.3 KiB
Markdown
150 lines
3.3 KiB
Markdown
# `Background` 类技术文档
|
|
|
|
## 概述
|
|
|
|
`Background` 是一个基于 Python 内置 `threading.Thread` 的轻量级封装类,用于在后台线程中异步执行指定的函数。通过继承 `Thread` 类,该类能够将任意可调用对象(函数、方法等)放入独立线程中运行,避免阻塞主线程。
|
|
|
|
---
|
|
|
|
## 依赖
|
|
|
|
- Python 标准库:`threading`
|
|
|
|
```python
|
|
from threading import Thread
|
|
```
|
|
|
|
---
|
|
|
|
## 类定义
|
|
|
|
```python
|
|
class Background(Thread):
|
|
def __init__(self, func, *args, **kw):
|
|
Thread.__init__(self)
|
|
self.__callee = func
|
|
self.__args = args
|
|
self.__kw = kw
|
|
|
|
def run(self):
|
|
return self.__callee(*self.__args, **self.__kw)
|
|
```
|
|
|
|
---
|
|
|
|
## 构造函数
|
|
|
|
### `__init__(self, func, *args, **kw)`
|
|
|
|
初始化一个 `Background` 实例。
|
|
|
|
#### 参数
|
|
|
|
| 参数 | 类型 | 说明 |
|
|
|------|------|------|
|
|
| `func` | `callable` | 要在后台线程中执行的函数或可调用对象。 |
|
|
| `*args` | `tuple` | 传递给 `func` 的位置参数。 |
|
|
| `**kw` | `dict` | 传递给 `func` 的关键字参数。 |
|
|
|
|
#### 示例
|
|
|
|
```python
|
|
def greet(name, message="Hello"):
|
|
print(f"{message}, {name}!")
|
|
|
|
# 创建 Background 实例
|
|
bg_task = Background(greet, "Alice", message="Hi")
|
|
```
|
|
|
|
---
|
|
|
|
## 方法
|
|
|
|
### `run(self)`
|
|
|
|
重写自 `Thread.run()`,在调用 `start()` 时自动执行。该方法会调用构造函数中传入的 `func`,并传入指定的参数。
|
|
|
|
> ⚠️ 注意:`run()` 方法的返回值 **不会** 被线程机制捕获或传递回主线程。若需获取返回值,应结合 `queue.Queue` 或 `concurrent.futures.Future` 等机制实现。
|
|
|
|
#### 示例
|
|
|
|
```python
|
|
bg_task.start() # 启动线程,执行 greet 函数
|
|
```
|
|
|
|
---
|
|
|
|
## 使用示例
|
|
|
|
### 基本用法
|
|
|
|
```python
|
|
import time
|
|
|
|
def long_running_task(duration):
|
|
print("任务开始...")
|
|
time.sleep(duration)
|
|
print("任务完成!")
|
|
|
|
# 在后台执行耗时任务
|
|
bg = Background(long_running_task, 3)
|
|
bg.start() # 非阻塞,立即返回
|
|
|
|
print("主线程继续运行...")
|
|
|
|
bg.join() # 可选:等待后台任务完成
|
|
```
|
|
|
|
### 输出结果
|
|
|
|
```
|
|
任务开始...
|
|
主线程继续运行...
|
|
任务完成!
|
|
```
|
|
|
|
---
|
|
|
|
## 注意事项
|
|
|
|
1. **返回值不可直接获取**
|
|
`Background` 类的 `run()` 方法虽然有 `return` 语句,但线程无法直接获取其返回值。如需获取结果,请使用如下方式:
|
|
|
|
```python
|
|
from queue import Queue
|
|
|
|
def task_with_result(q):
|
|
result = "处理完成"
|
|
q.put(result)
|
|
|
|
q = Queue()
|
|
bg = Background(task_with_result, q)
|
|
bg.start()
|
|
bg.join()
|
|
print(q.get()) # 获取结果
|
|
```
|
|
|
|
2. **异常处理**
|
|
若目标函数抛出异常,异常将在子线程中引发,但不会自动传播到主线程。建议在 `func` 内部进行异常捕获和日志记录。
|
|
|
|
3. **线程安全**
|
|
确保 `func` 中访问的资源是线程安全的,必要时使用锁(`threading.Lock`)保护共享数据。
|
|
|
|
---
|
|
|
|
## 扩展建议
|
|
|
|
- 可扩展为支持回调函数、超时控制、结果回调等功能。
|
|
- 推荐在复杂场景下使用 `concurrent.futures.ThreadPoolExecutor` 替代手动线程管理。
|
|
|
|
---
|
|
|
|
## 版本兼容性
|
|
|
|
- 支持 Python 3.6+
|
|
|
|
---
|
|
|
|
## 许可证
|
|
|
|
此代码为公共领域示例代码,可用于学习与商业用途(请根据实际项目要求添加许可证)。 |