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