Skip to content

2. 多线程开发

创建并启动线程

python
import threading


def task(arg):
    pass


# 创建一个 Thread 对象(线程),当前进程向内核申请创建一个新线程,新线程归当前进程所有
t = threading.Thread(target=task, args=("xxx",))
# 线程准备就绪(等待 CPU 调度),代码可以向下执行
t.start()

# 主线程执行完所有代码,不结束,等待子线程结束
print("主线程继续运行")

线程的常见方法

start()

  • t.start():当前线程准备就绪,等待 CPU 调度执行,具体时间是由CPU来决定

join()

  • t.join(): 控制主线程在什么地方等待子线程结束,默认阻塞等待
python
import threading

number = 0


def _add():
    global number
    for _ in range(1000000):
        number += 1


t = threading.Thread(target=_add)
t.start()

t.join()  # 主线程在这里等待子线程结束

print(number)
python
import threading

number = 0


def _add():
    global number
    for i in range(1000000):
        number += 1


def _sub():
    global number
    for i in range(1000000):
        number -= 1


t1 = threading.Thread(target=_add)
t2 = threading.Thread(target=_sub)
t1.start()
t1.join()  # 主线程在此等候t1线程执行完毕
t2.start()
t2.join()  # 主线程在此等候t2线程执行完毕

print(number)

示例二:同时启动 t1 和 t2(并发执行),可能出现竞态条件,结果不确定

python
import threading

number = 0


def _add():
    global number
    for i in range(1000000):
        number += 1


def _sub():
    global number
    for i in range(1000000):
        number -= 1


t1 = threading.Thread(target=_add)
t2 = threading.Thread(target=_sub)
t1.start()
t2.start()

t1.join()  # 主线程在此等候t1线程执行完毕
t2.join()  # 主线程在此等候t2线程执行完毕

print(number)

setDaemon()

  • t.setDaemon(布尔值): 守护线程,必须放在 start() 之前调用。
    • t.setDaemon(True):设置为守护线程,主线程执行完毕后,子线程强制结束
    • t.setDaemon(False):设置为非守护线程,主线程等待子线程,子线程执行完毕后,主线程才结束。(默认值)
python
import threading
import time


def task(arg):
    time.sleep(2)
    print("子线程结束")


t = threading.Thread(target=task, args=(11,))
t.setDaemon(True)  # 设置为守护线程
t.start()

print("主线程结束")

线程名称的设置和获取

  • 线程名称的设置和获取,设置线程名称必须放在 start() 之前
python
import threading


def task(arg):
    # 获取当前线程名称
    name = threading.current_thread().getName()
    print(f"线程 {name} 执行任务")


for i in range(10):
    t = threading.Thread(target=task, args=(11,))
    # 设置线程名称,必须在start()之前
    t.setName(f"Worker-{i}")
    t.start()

自定义线程类

  • 自定义线程类,直接将线程需要做的事写到类的 run() 方法中
python
import threading


class MyThread(threading.Thread):
    def run(self):
        print("执行此进程", self.args)


t = MyThread(args=(100,))
t.start()

构建时间:11/21/2025, 1:28:39 PM | 本博客内容均为自己学习,如内容涉及侵权,请联系邮箱:pangzl0215@163.com