首页 > 编程语言 >Python之多线程

Python之多线程

时间:2024-10-28 13:09:09浏览次数:4  
标签:Thread Python threading 线程 time print import 多线程

一、使用threading模块的Thread类

1.1 介绍

  这是 Python 中最基本的创建线程的方法。通过定义一个函数,然后将这个函数作为参数传递给Thread类的构造函数来创建线程。每个线程对象代表一个独立的执行线程。

1.2 代码示例

import threading
import time

def print_numbers():
    for i in range(1, 6):
        print(i)
        time.sleep(1)

def print_letters():
    for letter in 'abcde':
        print(letter)
        time.sleep(1)

t1 = threading.Thread(target = print_numbers)
t2 = threading.Thread(target = print_letters)

t1.start()
t2.start()

t1.join()
t2.join()

1.3 优点

  简单直观,易于理解和使用。对于初学者来说,这种方式很容易上手。可以方便地控制每个线程的执行,如启动(start)和等待线程结束(join)。简单易用,适合轻量级的线程管理。

1.4 缺点

  当需要创建大量线程时,代码可能会变得冗长。由于全局解释器锁(GIL)的存在,在CPU密集型任务中,多线程可能不会带来性能上的提升。

二、继承threading.Thread类

2.1 介绍

  通过创建一个新的类,继承自threading.Thread类,然后重写run方法。在run方法中定义线程要执行的任务。这样创建的类的实例就是一个线程对象。

2.2 代码示例

import threading
import time

class PrintNumbersThread(threading.Thread):
    def run(self):
        for i in range(1, 6):
            print(i)
            time.sleep(1)

class PrintLettersThread(threading.Thread):
    def run(self):
        for letter in 'abcde':
            print(letter)
            time.sleep(1)

t1 = PrintNumbersThread()
t2 = PrintLettersThread()

t1.start()
t2.start()

t1.join()
t2.join()

2.3 优点

  对于复杂的线程任务,可以将相关的代码封装在一个类中,使代码结构更加清晰。可以方便地在类中定义属性和方法,方便线程之间的交互和数据共享(通过类的属性)。

2.4 缺点

  相对于第一种方法,代码量可能会更多,因为需要创建一个新的类。继承关系可能会使代码的逻辑变得稍微复杂一些,特别是对于不熟悉面向对象编程的开发者。

三、使用concurrent.futures模块中的ThreadPoolExecutor

3.1 介绍

  这个模块提供了一个高级的接口来管理线程池。ThreadPoolExecutor可以自动管理线程的创建、复用和销毁。可以通过提交任务(函数及其参数)到线程池来并发执行任务。

3.2 代码示例

import concurrent.futures
import time

def print_numbers():
    for i in range(1, 6):
        print(i)
        time.sleep(1)

def print_letters():
    for letter in 'abcde':
        print(letter)
        time.sleep(1)

with concurrent.futures.ThreadPoolExecutor(max_workers = 2) as executor:
    future1 = executor.submit(print_numbers)
    future2 = executor.submit(print_letters)
    futures = [future1, future2]
    for future in concurrent.futures.as_completed(futures):
        try:
            future.result()
        except Exception as e:
            print("An error occurred:", e)

3.3 优点

  它可以有效地管理线程资源,避免了频繁地创建和销毁线程的开销,尤其适用于需要执行大量短任务的情况。可以方便地获取任务的执行结果,并且可以处理任务执行过程中的异常。提供了更高级的接口,易于管理多个线程,适用于多种并发任务。

3.4 缺点

  对于简单的场景,可能会觉得使用ThreadPoolExecutor有些过于复杂。如果对线程池的大小(max_workers)设置不合理,可能会影响性能。例如设置得过大可能会导致资源竞争,设置得过小可能无法充分利用多核处理器。同样受GIL限制,适合I/O密集型任务。

四、使用multiprocessing模块

4.1 介绍

  虽然这个模块主要用于创建多进程,但也可以用来创建多线程。通过Process类创建进程时,可以设置daemon=True,这样进程就会在后台运行,类似于线程。

4.2 代码示例

from multiprocessing import Process

def task(name):
    print(f"Process {name}: starting")
    for i in range(5):
        print(f"Process {name}: {i}")
    print(f"Process {name}: finishing")

# 创建进程
process1 = Process(target=task, args=("A",), daemon=True)
process2 = Process(target=task, args=("B",), daemon=True)

# 启动进程
process1.start()
process2.start()

# 等待进程完成
process1.join()
process2.join()

4.3 优点

  可以绕过GIL,适用于CPU密集型任务。

4.4 缺点

  进程间通信比线程间通信更复杂,资源消耗也更大。

五、使用第三方库

  例如threadpool、greenlet等,这些库提供了更高级的线程管理功能。

总结

  每种方法都有其适用场景。对于I/O密集型任务,threading和concurrent.futures是不错的选择;而对于CPU密集型任务,则可能需要考虑使用multiprocessing或第三方库。选择哪种方法取决于具体的应用需求和性能考量。

标签:Thread,Python,threading,线程,time,print,import,多线程
From: https://www.cnblogs.com/yqw0710/p/18510313

相关文章

  • python基础(列表)
    学习目标:列表的介绍,创建,索引,切片,增加,删除,插入,修改,清空,排序,反转,长度,复制,统计,最大值和最小值,列表的遍历!一.列表的介绍列表是Python中的一种数据结构,用于存储多个元素。是可变的数据类型。列表可以包含任意类型的数据,比如整数、浮点数、字符串等。列表是有序的,即列表中的元素......
  • python——使用线程池实现异步返回数据
    框架flask应用场景当接收到请求,但数据处理比较耗时,希望请求过来时先返回一个响应,再慢慢处理数据,处理完成后再将结果返回给另一个地址。流程:接收到请求,立即返回响应。再处理数据,处理完成后将结果响应给预先定义的URL。importtracebackimportrequestsfromconcurrent.......
  • Python 的魔法搜索:如何用代码解锁淘宝商品关键字的神秘力量
    在淘宝这个充满奇迹的电商王国里,每一个商品关键字都像是一把古老的钥匙,能够解锁隐藏在茫茫商品海洋中的宝藏。今天,我们要讲述的是如何成为一名Python魔法师,用你的代码魔杖,施展搜索魔法,按关键字精准搜索商品,并获取它们的API数据。准备你的魔法工具箱:Python开发环境在这场......
  • Java 多线程面试题
    什么是线程和进程?进程(Process)定义:进程是一个正在运行的程序的实例。每个进程都有自己的内存空间、数据栈和其他用于跟踪进程执行的辅助数据。特性:        进程之间是相互独立的,拥有各自的地址空间。        进程间通信(IPC)相对复杂,通常需要使用管道、套接......
  • python+flask框架的基于微信小程序的体检预约系统小程序8(开题+程序+论文) 计算机毕业
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的飞速发展,微信小程序作为一种轻量级的应用形式,因其便捷性和即用即走的特性,深受用户喜爱。在医疗健康领域,体检预约系统......
  • python+flask框架的基于微信小程序的体检预约系统后台8(开题+程序+论文) 计算机毕业设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的快速发展,人们越来越依赖于智能手机和各类应用程序来满足日常生活需求。微信小程序作为一种轻量级的应用形式,因其无需......
  • python+flask框架的基于微信小程序的树洞交流平台38(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着移动互联网技术的飞速发展,社交媒体平台已成为人们日常生活中不可或缺的一部分。微信小程序作为一种轻量级的应用形态,凭借其无需下载、......
  • python+flask框架的基于微信小程序的树洞交流平台(开题+程序+论文) 计算机毕业设计
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容选题背景随着互联网技术的飞速发展,社交媒体平台已成为人们日常交流的重要工具。微信小程序作为一种轻量级的应用形式,凭借其便捷性和即用即走的特性......
  • 100种算法【Python版】第15篇——KMP算法
    本文目录1算法原理1.1部分匹配表2实现步骤3示例说明4python实例5算法应用领域1算法原理KMP(Knuth-Morris-Pratt)算法是一种用于高效字符串匹配的算法。它通过预处理模式字符串,构建一个部分匹配表(前缀函数),以避免重复比较,从而提高匹配效率。KMP算法通......
  • Python海盗的寻宝之旅:如何用代码掠夺淘宝商品关键字的宝藏?
    在淘宝这片波涛汹涌的电商大海中,商品关键字就像是藏宝图上的秘密标记,指引着勇敢的海盗们寻找隐藏在数字波涛中的宝藏。今天,我们要讲述的是如何成为一名Python海盗,用你的代码弯刀,掠夺淘宝商品关键字的宝藏——精准搜索商品的API数据。准备你的海盗装备:Python开发环境在这场寻......