python线程的run和start有什么区别?
时间: 2025-07-24 15:27:23 浏览: 14
<think>我们正在讨论Python线程中run()和start()方法的区别。根据用户的问题,我们需要解释这两个方法的不同之处。
首先,回顾一下threading模块的基本用法。当我们创建一个Thread对象时,我们通常会调用start()方法来启动线程。而run()方法是线程实际执行的方法,但通常我们不直接调用它。
关键点:
1. start()方法会启动一个新的线程,并在新线程中调用run()方法。
2. 直接调用run()方法不会创建新线程,而是在当前线程中执行run()方法的内容,就像普通函数调用一样。
为了说明这一点,我们可以参考用户提供的引用[1]中的代码片段。在该代码中,通过创建Thread对象并调用start()方法,两个线程并发执行。如果改为调用run()方法,则不会创建新线程,而是顺序执行。
我们还可以通过一个简单的例子来展示:
```python
import threading
import time
class MyThread(threading.Thread):
def run(self):
print("Thread started")
time.sleep(1)
print("Thread finished")
# 创建线程对象
t = MyThread()
# 使用start()方法:会启动新线程
print("Using start():")
t.start()
t.join() # 等待线程结束
# 使用run()方法:不会启动新线程,而是在当前线程执行
print("Using run():")
t.run() # 注意:这里没有新线程,所以会顺序执行,并且会等待sleep完成
```
输出结果:
```
Using start():
Thread started
(等待约1秒)
Thread finished
Using run():
Thread started
(等待约1秒)
Thread finished
```
注意:使用start()时,两条打印语句之间会有1秒的等待,但在这1秒内,主线程可以继续执行其他操作(这里我们调用了join所以主线程等待)。而使用run()时,整个程序会阻塞在run()调用上,直到run()方法返回。
另外,用户提供的引用[2]中也有一个使用Thread的示例,其中使用了start()方法来启动线程。
总结:
- start():启动新线程,然后在新线程中自动调用run()方法。这是多线程执行的关键。
- run():只是线程要执行的方法,但直接调用它并不会创建新线程。通常我们重写run()方法来定义线程的行为,但不直接调用它(除非我们不想用多线程)。
因此,区别在于:start()用于启动新线程,而run()是线程执行的主体,但不启动新线程。
相关问题:
1. Python中如何创建线程?
2. 除了继承Thread类重写run()方法,还有哪些方式定义线程任务?
3. 如何确保线程安全?
4. Python的GIL(全局解释器锁)对多线程有什么影响?
5. 如何实现线程间的通信?</think>### Python线程中`run()`与`start()`方法的区别
在Python的`threading`模块中,`run()`和`start()`是`Thread`类的两个核心方法,它们的核心区别在于**线程执行方式**:
1. **`start()`方法**
- 启动新线程:调用操作系统API创建新线程
- 异步执行:在新线程中自动调用`run()`方法
- 非阻塞:调用后立即返回,主线程继续执行
```python
t = Thread(target=task)
t.start() # 创建新线程执行任务
```
2. **`run()`方法**
- 直接执行:在当前线程同步执行任务代码
- 阻塞调用:任务完成前不会返回
- 无新线程:不会触发操作系统级的线程创建
```python
t = Thread(target=task)
t.run() # 在当前主线程执行任务(非多线程)
```
#### 关键差异对比表
| 特性 | `start()` | `run()` |
|--------------|-------------------------|-------------------------|
| **线程创建** | 创建新OS级线程 | 无新线程 |
| **执行方式** | 异步并发 | 同步阻塞 |
| **调用关系** | 自动调用`run()` | 直接执行任务代码 |
| **性能影响** | 有线程切换开销 | 无额外开销 |
| **典型用途** | 实现并发 | 调试/单线程执行测试 |
#### 示例说明
参考用户提供的并发线程示例[^1]:
```python
# 正确并发方式 (使用start())
for tid in range(2):
t = Thread(target=my_counter)
t.start() # 创建两个并发线程
# 错误用法 (实际是单线程)
t = Thread(target=my_counter)
t.run() # 主线程阻塞执行,无并发效果
```
#### 何时使用?
- 需要并发时 → 用`start()`
- 测试任务逻辑 → 用`run()`
- 自定义线程类 → 重写`run()`方法(但仍通过`start()`触发)
> 关键原理:`start()`通过调用底层`_start_new_thread()`创建系统线程[^4],而`run()`只是普通方法调用。
阅读全文
相关推荐



















