例如"在桌面上双击打开一个App", 桌面App程序会调用OS的系统调用接口fork,让OS 创建一个进程出来,OS为你准备好进程的结构体对象,将这个App的文件(xxx.exe, 存放编译好的代码指令)加载到进程的代码段,同时OS会为你创建一个线程(main thread), 在代码里面,还可以调用OS的接口,来创建多个线程,这样OS就可以调度这些线程执行了,接下来我们来来看python 的线程
方式一:传递可调用对象给threading.Thread构造函数
你可以将一个可调用对象(通常是函数或方法)传递给threading.Thread的构造函数,线程将执行这个可调用对象。
import threading
# 定义一个可调用函数
def my_function():
# 线程的执行逻辑写在这里
print("线程开始执行")
# 创建线程对象,传递可调用函数
thread2 = threading.Thread(target=my_function)
# 启动线程
thread2.start()
# 等待线程结束
thread2.join()
print("线程执行完毕")
# ---encoding:utf-8---
# @Time : 2023/9/11 21:16
# @Author : Darwin_Bossen
# @Email :[email protected]
# @Site : Thread 线程
# @File : ThreadTest.py
import threading
if __name__ == '__main__':
# 1. 创建线程
# target: 线程执行的目标函数
# args: 以元组的方式给线程传参
# kwargs: 以字典的方式给线程传参
# name: 线程的名字
# daemon: 是否是守护线程
# thread = threading.Thread(target=func, args=(1, 2, 3), kwargs={"a": 1, "b": 2}, name="线程1", daemon=True)
# thread = threading.Thread(target=func, args=(1, 2, 3), kwargs={"a": 1, "b": 2}, name="线程1")
# thread = threading.Thread(target=func, args=(1, 2, 3), kwargs={"a": 1, "b": 2})
# thread = threading.Thread(target=func, args=(1, 2, 3))
# thread = threading.Thread(target=func)
thread = threading.Thread()
# 2. 启动线程
thread.start()
# 3. 等待线程执行完毕
thread.join()
# 4. 获取线程名字
print(thread.name)
# 5. 获取当前线程
print(threading.current_thread())
# 6. 获取所有线程
print(threading.enumerate())
# 7. 获取活跃线程数量
print(threading.active_count())
# 8. 判断线程是否存活
print(thread.is_alive())
方式二:继承threading.Thread类:
你可以创建一个自定义的线程类,继承自threading.Thread,并覆盖其run方法来定义线程的执行逻辑。
# ---encoding:utf-8---
# @Time : 2023/9/11 21:32
# @Author : Darwin_Bossen
# @Email :[email protected]
# @Site : 继承线程创建
# @File : ThreadTest01.py
import threading
class MyThread(threading.Thread):
def run(self):
# 线程的执行逻辑写在这里
print("线程开始执行")
print(threading.current_thread())
print("线程执行结束")
if __name__ == '__main__':
# 创建线程对象
thread1 = MyThread()
# 启动线程
thread1.start()
# 等待线程结束
thread1.join()
print("线程执行完毕")
# ---encoding:utf-8---
# @Time : 2023/9/11 21:38
# @Author : Darwin_Bossen
# @Email :[email protected]
# @Site : 线程状态
# @File : ThreadStatus.py
import threading
import time
# 定义一个简单的线程函数
def thread_function():
for i in range(5):
print(f"线程正在执行:{i}")
time.sleep(1)
# 创建线程对象
thread = threading.Thread(target=thread_function)
# 启动线程
thread.start()
# 检查线程状态
while True:
if thread.is_alive():
print("线程仍然在运行...")
else:
print("线程已经结束。")
break
# 主线程等待子线程完成
thread.join()
print("主线程结束。")
if __name__ == '__main__':
pass
在这个示例中,我们首先创建了一个名为thread_function的简单线程函数,该函数只是循环打印数字并休眠1秒钟。然后,我们创建了一个线程对象,并使用**start()方法启动线程。在主线程中,我们使用is_alive()方法来检查线程是否仍然在运行,如果线程仍在运行,就会不断打印消息,一旦线程结束,就会退出循环。最后,我们使用join()**方法等待线程完成,然后打印主线程结束的消息。
Python线程的状态切换通常是由Python解释器和操作系统的线程调度器自动管理的,但是在编写多线程应用程序时,你可以使用一些关键函数来影响线程的状态切换。以下是一些关键的线程管理函数:
threading.Thread(target, args)
:用于创建一个新的线程对象。target
参数指定线程要执行的函数,args
参数是传递给线程函数的参数。start()
:启动线程。一旦线程启动,它将进入就绪状态并开始执行。join(timeout=None)
:等待线程完成。调用该方法会阻塞当前线程,直到被调用的线程执行完毕。可以使用timeout
参数来设置最长等待时间。is_alive()
:检查线程是否仍然在运行。返回True
表示线程仍在执行,返回False
表示线程已经结束。setDaemon(daemonic)
:将线程设置为守护线程。守护线程是一种特殊的线程,当主线程退出时,它们会被强制结束。join()
和is_alive()
通常用于等待和监视线程的状态切换。例如,在示例中使用了join()
来等待线程完成,并使用is_alive()
来检查线程是否仍在运行。线程状态的切换和管理通常由Python解释器和操作系统来处理,开发人员主要使用上述函数来与线程进行交互,以控制线程的行为和等待线程完成。
# ---encoding:utf-8---
# @Time : 2023/9/11 21:42
# @Author : Darwin_Bossen
# @Email :[email protected]
# @Site : 生产者消费者模型
# @File : Prouduct.py
import threading
import time
import random
# 共享的缓冲区
buffer = []
MAX_BUFFER_SIZE = 5
# 生产者函数
def producer():
while True:
item = random.randint(1, 100) # 随机生成一个数据项
if len(buffer) < MAX_BUFFER_SIZE:
buffer.append(item)
print(f"生产者生产了 {item}")
time.sleep(random.uniform(0.1, 0.5)) # 模拟生产时间
# 消费者函数
def consumer():
while True:
if len(buffer) > 0:
item = buffer.pop(0)
print(f"消费者消费了 {item}")
time.sleep(random.uniform(0.1, 0.5)) # 模拟消费时间
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
# 启动线程
producer_thread.start()
consumer_thread.start()
# 主线程等待子线程完成
producer_thread.join()
consumer_thread.join()
if __name__ == '__main__':
pass
线程同步是在多线程编程中用于控制线程之间协同工作的重要机制,主要有以下几个原因:
线程同步是多线程编程中的重要概念,它涉及到多个线程协调执行,以确保数据的一致性和正确性。以下是一些常见的线程同步机制和Python中的实现方式:
threading.Lock
来创建锁对象。import threading
lock = threading.Lock()
def example_function():
with lock:
# 临界区代码,只有一个线程可以执行此部分
pass
# ---encoding:utf-8---
# @Time : 2023/9/11 21:49
# @Author : Darwin_Bossen
# @Email :[email protected]
# @Site : Lock 锁 生产者消费者模型
# @File : LockTest.py
import threading
import time
import random
# 共享的缓冲区
buffer = []
MAX_BUFFER_SIZE = 5
# 创建锁对象
lock = threading.Lock()
# 生产者函数
def producer():
while True:
item = random.randint(1, 100) # 随机生成一个数据项
lock.acquire() # 获取锁
if len(buffer) < MAX_BUFFER_SIZE:
buffer.append(item)
print(f"{ threading.current_thread()}-生产者生产了 {item}")
lock.release() # 释放锁
time.sleep(random.uniform(0.1, 0.5)) # 模拟生产时间
# 消费者函数
def consumer():
while True:
lock.acquire() # 获取锁
if len(buffer) > 0:
item = buffer.pop(0)
print(f"{ threading.current_thread()}-消费者消费了 {item}")
lock.release() # 释放锁
time.sleep(random.uniform(0.1, 0.5)) # 模拟消费时间
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
# 启动线程
producer_thread.start()
consumer_thread.start()
# 主线程等待子线程完成
producer_thread.join()
consumer_thread.join()
if __name__ == '__main__':
pass
threading.Condition
来创建条件变量对象。import threading
condition = threading.Condition()
def producer():
with condition:
# 生产数据
condition.notify() # 通知消费者数据已准备好
def consumer():
with condition:
while not data_ready:
condition.wait() # 等待生产者通知数据已准备好
# 消费数据
# ---encoding:utf-8---
# @Time : 2023/9/11 21:54
# @Author : Darwin_Bossen
# @Email :[email protected]
# @Site : Condition 条件变量生产者消费者模型
# @File : ConditionTest.py
import threading
import time
import random
# 共享的缓冲区
buffer = []
MAX_BUFFER_SIZE = 5
# 创建条件变量对象
condition = threading.Condition()
# 生产者函数
def producer():
while True:
item = random.randint(1, 100) # 随机生成一个数据项
condition.acquire() # 获取锁
if len(buffer) < MAX_BUFFER_SIZE:
buffer.append(item)
print(f"{ threading.current_thread()}-生产者生产了 {item}")
condition.notify() # 通知消费者线程
condition.release() # 释放锁
time.sleep(random.uniform(0.1, 0.5)) # 模拟生产时间
# 消费者函数
def consumer():
while True:
condition.acquire() # 获取锁
if len(buffer) > 0:
item = buffer.pop(0)
print(f"{ threading.current_thread()}-消费者消费了 {item}")
condition.wait() # 等待生产者线程
condition.release() # 释放锁
time.sleep(random.uniform(0.1, 0.5)) # 模拟消费时间
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
# 启动线程
producer_thread.start()
consumer_thread.start()
# 主线程等待子线程完成
producer_thread.join()
consumer_thread.join()
if __name__ == '__main__':
pass
import threading
semaphore = threading.Semaphore(3) # 允许同时访问的线程数量为3
def example_function():
with semaphore:
# 最多有3个线程可以同时执行此部分
pass
# ---encoding:utf-8---
# @Time : 2023/9/11 21:57
# @Author : Darwin_Bossen
# @Email :[email protected]
# @Site : 信号量 Semaphore 生产者消费者模型
# @File : SemaphoreTest.py
import threading
import time
import random
# 共享的缓冲区
buffer = []
MAX_BUFFER_SIZE = 5
# 创建信号量对象
semaphore = threading.Semaphore(1)
# 生产者函数
def producer():
while True:
item = random.randint(1, 100) # 随机生成一个数据项
semaphore.acquire() # 获取信号量
if len(buffer) < MAX_BUFFER_SIZE:
buffer.append(item)
print(f"{ threading.current_thread()}-生产者生产了 {item}")
semaphore.release() # 释放信号量
time.sleep(random.uniform(0.1, 0.5)) # 模拟生产时间
# 消费者函数
def consumer():
while True:
semaphore.acquire() # 获取信号量
if len(buffer) > 0:
item = buffer.pop(0)
print(f"{ threading.current_thread()}-消费者消费了 {item}")
semaphore.release() # 释放信号量
time.sleep(random.uniform(0.1, 0.5)) # 模拟消费时间
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
# 启动线程
producer_thread.start()
consumer_thread.start()
# 主线程等待子线程完成
producer_thread.join()
consumer_thread.join()
if __name__ == '__main__':
pass
import threading
event = threading.Event()
def thread1():
event.wait() # 等待事件变为真
# 执行线程1的操作
def thread2():
# 执行线程2的操作
event.set() # 设置事件为真,通知线程1
# ---encoding:utf-8---
# @Time : 2023/9/11 21:59
# @Author : Darwin_Bossen
# @Email :[email protected]
# @Site : Event 事件 生产者消费者模型
# @File : EventTest.py
import threading
import time
import random
# 共享的缓冲区
buffer = []
MAX_BUFFER_SIZE = 5
# 创建事件对象
event = threading.Event()
# 生产者函数
def producer():
while True:
item = random.randint(1, 100) # 随机生成一个数据项
if len(buffer) < MAX_BUFFER_SIZE:
buffer.append(item)
print(f"{ threading.current_thread()}-生产者生产了 {item}")
event.set() # 设置事件
time.sleep(random.uniform(0.1, 0.5)) # 模拟生产时间
# 消费者函数
def consumer():
while True:
if len(buffer) > 0:
item = buffer.pop(0)
print(f"{ threading.current_thread()}-消费者消费了 {item}")
event.clear() # 清除事件
event.wait() # 等待事件
time.sleep(random.uniform(0.1, 0.5)) # 模拟消费时间
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread = threading.Thread(target=consumer)
# 启动线程
producer_thread.start()
consumer_thread.start()
# 主线程等待子线程完成
producer_thread.join()
consumer_thread.join()
if __name__ == '__main__':
pass
搜索