Python 线程学习知识大全

devtools/2024/11/7 21:46:42/

在这里插入图片描述

一、Python 线程简介

线程是操作系统能够进行运算调度的最小单位,在 Python 中,threading模块提供了对线程的支持。使用线程可以实现并行和并发执行任务,从而提高程序的效率。

二、Python 线程不用 join()

以下是一个没有使用join()的示例代码:

python">import threading
import timedef print_numbers():# 打印数字 1 到 5for i in range(1, 6):print(f"Number: {i}")time.sleep(1)t = threading.Thread(target=print_numbers)
t.start()print("Main thread continues without waiting for the child thread.")

在这个例子中,创建了一个线程t来执行print_numbers函数,该函数会依次打印数字 1 到 5,每次打印间隔 1 秒。主线程启动子线程后,不会等待子线程执行完毕,直接继续执行打印语句。

三、Python 线程用 join()

使用join()可以让主线程等待子线程执行完毕后再继续执行。

python">import threading
import timedef print_numbers():for i in range(1, 6):print(f"Number: {i}")time.sleep(1)t = threading.Thread(target=print_numbers)
t.start()
t.join()print("Main thread waits for the child thread to finish.")

这里主线程在启动子线程后,调用t.join(),这会使主线程暂停,直到子线程执行完毕。

四、Python有输入参数的线程

可以向线程函数传递参数。

python">import threadingdef print_name(name):print(f"Hello, {name}!")t = threading.Thread(target=print_name, args=("Alice",))
t.start()

在这个例子中,创建了一个线程来执行print_name函数,并传递参数"Alice"。

五、Python多线程

可以同时运行多个线程执行不同的任务。

python">import threading
import timedef task1():for i in range(5):print("Task 1:", i)time.sleep(1)def task2():for i in range(5):print("Task 2:", i)time.sleep(1.5)t1 = threading.Thread(target=task1)
t2 = threading.Thread(target=task2)t1.start()
t2.start()

这里同时启动两个线程分别执行不同的任务。

六、Python守护线程

守护线程在主线程退出时会自动退出。

python">import threading
import timedef background_task():while True:print("Background task is running...")time.sleep(2)t = threading.Thread(target=background_task)
t.daemon = True
t.start()print("Main thread is exiting.")

在这个例子中,创建了一个守护线程t,如果不是守护线程,即使主线程退出,后台任务仍会继续运行,而设置为守护线程后,当主线程退出时,守护线程也会自动退出。

七、Python使用锁来实现线程同步

使用锁来实现线程同步,防止多个线程同时访问共享资源导致数据不一致。

python">import threadingcounter = 0
lock = threading.Lock()def increment():global counterfor _ in range(10000):with lock:counter += 1t1 = threading.Thread(target=increment)
t2 = threading.Thread(target=increment)t1.start()
t2.start()
t1.join()
t2.join()print(f"Final counter value: {counter}")

两个线程同时对全局变量counter进行递增操作,使用锁确保在一个线程操作counter时,其他线程不能同时进行操作。

八、Python使用队列实现线程间通信

使用队列实现线程间通信。

python">import threading
import queuedef producer(q):for i in range(5):q.put(i)print(f"Produced: {i}")def consumer(q):while True:item = q.get()if item is None:breakprint(f"Consumed: {item}")q = queue.Queue()
t1 = threading.Thread(target=producer, args=(q,))
t2 = threading.Thread(target=consumer, args=(q,))t1.start()
t2.start()t1.join()
q.put(None)
t2.join()

producer线程向队列中放入数据,consumer线程从队列中取出数据进行处理。

九、Python使用线程池来管理多个线程的执行

使用线程池来管理多个线程的执行。

python">import concurrent.futuresdef square_number(n):return n * nwith concurrent.futures.ThreadPoolExecutor(max_workers=3) as executor:numbers = [2, 3, 4, 5]results = executor.map(square_number, numbers)for result in results:print(result)

创建一个线程池,将任务分配给线程池中的线程执行。

十、Python 使用事件来实现线程间的同步

使用事件来实现线程间的同步。

python">import threadingevent = threading.Event()def wait_for_event():print("Waiting for event...")event.wait()print("Event received!")def set_event():print("Setting event...")event.set()t1 = threading.Thread(target=wait_for_event)
t2 = threading.Thread(target=set_event)t1.start()
t2.start()

一个线程等待事件,另一个线程设置事件,从而实现线程间的同步。

十一、比较单线程和多线程在 I/O 任务上的速度

比较单线程和多线程在 I/O 任务上的速度。

python">import time
import threadingdef io_task(delay):time.sleep(delay)# 单线程执行
start_time = time.time()
io_task(2)
io_task(2)
print(f"Single-threaded time: {time.time() - start_time} seconds")# 多线程执行
start_time = time.time()
t1 = threading.Thread(target=io_task, args=(2,))
t2 = threading.Thread(target=io_task, args=(2,))
t1.start()
t2.start()
t1.join()
t2.join()
print(f"Multi-threaded time: {time.time() - start_time} seconds")

可以观察到在 I/O 任务中,多线程可以提高执行效率,减少总执行时间。

十二、比较多线程和多进程在 CPU 密集型任务上的速度

比较多线程和多进程在 CPU 密集型任务上的速度。

python">import time
from multiprocessing import Process
import threadingdef cpu_task(n):result = 0for _ in range(n):result += 1# 多线程执行
start_time = time.time()
t1 = threading.Thread(target=cpu_task, args=(100000000,))
t2 = threading.Thread(target=cpu_task, args=(100000000,))
t1.start()
t2.start()
t1.join()
t2.join()
print(f"Multi-threaded CPU task time: {time.time() - start_time} seconds")# 多进程执行
start_time = time.time()
p1 = Process(target=cpu_task, args=(100000000,))
p2 = Process(target=cpu_task, args=(100000000,))
p1.start()
p2.start()
p1.join()
p2.join()
print(f"Multi-process CPU task time: {time.time() - start_time} seconds")

在 CPU 密集型任务中,多进程通常比多线程更有效,因为 Python 的全局解释器锁(GIL)限制了多线程在 CPU 密集型任务上的性能。


http://www.ppmy.cn/devtools/131697.html

相关文章

LINUX离线安装Milvus

一.下载安装包 离线安装Docker需要你提前下载Docker的安装包,并将其传输到目标机器上进行安装。以下是一个基于Linux系统的离线安装Docker的简要步骤和示例: 从有网络的机器上下载Docker安装包。 将下载的安装包拷贝到离线的服务器上。 在离线的服务…

随机性、熵与随机数生成器:解析伪随机数生成器(PRNG)和真随机数生成器(TRNG)

随机性在诸多领域中扮演着至关重要的角色,涵盖密码学、仿真和机器学习等方面。因为随机性为无偏决策、不可预测序列和安全加密提供了基础。然而生成随机数是一项复杂的任务,理解伪随机数生成(pseudo-random number generation, PRNG)与真随机数生成(true random number generat…

【ESP32+MicroPython】单位数码管使用

在本教程中,我们将使用ESP32和MicroPython来驱动一个带小数点的单位数码管(7段显示器)。将详细讲解数码管的工作原理,并分步骤完成从基本的段位控制到完整的数字显示,最后封装成可重用的控制类。同时,本文将…

第一章 Linux安装 -- 安装Debian 12操作系统(四)

文章目录 2.3.4 安装Debian 12操作系统 2.3.4 安装Debian 12操作系统 虚拟机的创建参照前面2.3.1.3节里的步骤创建,这里不再详述。 下面就开始安装Debian 12系统了,单击“开启此虚拟机”,如图1-161虚拟机主界面。 图1-161 虚拟机主界面 弹…

微服务架构面试内容整理-微服务架构的定义及优势

微服务架构是一种软件架构风格,它将应用程序构建为一组小的、独立的服务,每个服务围绕特定的业务功能进行开发和部署。每个微服务都可以独立运行、独立部署,并通过轻量级的通信机制(如 HTTP/REST、gRPC 或消息队列)进行交互。 微服务架构的优势: 1. 独立性: 每个微服务…

【Linux】网络相关的命令

目录 ① ip addr show ② ip route show ③ iptables -nvL ④ ping -I enx00e04c6666c0 192.168.1.100 ⑤ ip route get 192.168.1.100 ⑥ sudo ip addr add dev enx00e04c6666c0 192.168.1.101/24 ⑦ ifconfig ⑧ netstat ⑨ traceroute ⑩ nslookup ① ip addr sho…

java 中List 的使用

List集合是Collection接口的子接口,其下有两个实现类分别为ArrayList和 LinkedList List是一个接口,不能用new创建对象,需要用 ArrayList类 和 LinkedList类 来创建 特点 有序:存储元素的顺序和取出元素的顺序一致可以重复&…

C#:强大而优雅的编程语言

在当今的软件开发领域,C#作为一种广泛应用的编程语言,以其强大的功能、优雅的语法和丰富的生态系统,受到了众多开发者的喜爱。本文将深入探讨 C#的各个方面,展示它的魅力和优势。 一、C#的历史与发展 C#是由微软公司开发的一种面…