首页 > 系统相关 >Python多线程与多进程编程:提升程序性能的实用技巧

Python多线程与多进程编程:提升程序性能的实用技巧

时间:2024-07-09 12:57:36浏览次数:17  
标签:实用技巧 thread Python print process 线程 url 进程 多线程

关注微信订阅号

前言

大家好!今天我们要深入探讨Python中的多线程与多进程编程,这可是提升程序并发性能的关键技能之一。记得我在处理大量数据时,通过多线程和多进程技术,大大提高了程序的执行效率。为了让大家也能掌握这些实用技巧,我将通过多个具体案例,详细讲解如何在Python中实现多线程和多进程编程。每一行代码都有详细注释,确保新手也能轻松理解。准备好了吗?让我们开始吧!

1. Python中的多线程编程

1.1 什么是多线程?

多线程是指在一个进程中执行多个线程,每个线程可以执行不同的任务。Python的threading模块提供了创建和管理线程的功能。

1.2 创建简单线程

下面的代码示例展示了如何创建和启动一个简单的线程:

import threading
import time

# 定义一个简单的线程任务函数
def thread_task(name):
    print(f"线程 {name} 开始运行")
    time.sleep(2)  # 模拟耗时任务
    print(f"线程 {name} 结束运行")

# 创建并启动线程
thread = threading.Thread(target=thread_task, args=("A",))
thread.start()

# 主线程继续执行
print("主线程继续执行")

# 等待子线程完成
thread.join()
print("主线程结束")

1.3 线程同步

在多线程编程中,同步是一个重要问题。我们可以使用锁来确保线程安全:

import threading

# 定义全局变量和锁
counter = 0
counter_lock = threading.Lock()

# 定义线程任务函数
def increment_counter():
    global counter
    with counter_lock:  # 获取锁
        temp = counter
        temp += 1
        time.sleep(0.1)  # 模拟耗时操作
        counter = temp

# 创建并启动多个线程
threads = []
for _ in range(5):
    thread = threading.Thread(target=increment_counter)
    threads.append(thread)
    thread.start()

# 等待所有线程完成
for thread in threads:
    thread.join()

print(f"最终计数值: {counter}")

2. Python中的多进程编程

2.1 什么是多进程?

多进程是指同时运行多个进程,每个进程有独立的内存空间和全局解释器锁(GIL)。Python的multiprocessing模块提供了创建和管理进程的功能。

2.2 创建简单进程

下面的代码示例展示了如何创建和启动一个简单的进程:

import multiprocessing
import time

# 定义一个简单的进程任务函数
def process_task(name):
    print(f"进程 {name} 开始运行")
    time.sleep(2)  # 模拟耗时任务
    print(f"进程 {name} 结束运行")

# 创建并启动进程
process = multiprocessing.Process(target=process_task, args=("A",))
process.start()

# 主进程继续执行
print("主进程继续执行")

# 等待子进程完成
process.join()
print("主进程结束")

2.3 进程间通信

在多进程编程中,进程间通信(IPC)是一个重要问题。我们可以使用队列(Queue)来实现进程间的数据传递:

import multiprocessing

# 定义进程任务函数
def producer(queue):
    for i in range(5):
        item = f"item-{i}"
        print(f"生产: {item}")
        queue.put(item)
        time.sleep(1)

def consumer(queue):
    while True:
        item = queue.get()
        if item is None:  # 接收到结束信号
            break
        print(f"消费: {item}")

# 创建队列
queue = multiprocessing.Queue()

# 创建生产者和消费者进程
producer_process = multiprocessing.Process(target=producer, args=(queue,))
consumer_process = multiprocessing.Process(target=consumer, args=(queue,))

# 启动进程
producer_process.start()
consumer_process.start()

# 等待生产者进程结束
producer_process.join()

# 发送结束信号
queue.put(None)

# 等待消费者进程结束
consumer_process.join()

3. 实战案例:网页抓取

让我们通过一个网页抓取的实际案例,结合多线程和多进程的优势,来总结一下上述内容。假设我们需要抓取多个网页的内容,并分析其中的特定信息。

3.1 多线程网页抓取

import threading
import requests

# 定义线程任务函数
def fetch_url(url):
    response = requests.get(url)
    print(f"抓取 {url} 状态码: {response.status_code}")

# 待抓取的URL列表
urls = [
    "https://www.example.com",
    "https://www.python.org",
    "https://www.github.com"
]

# 创建并启动多个线程
threads = []
for url in urls:
    thread = threading.Thread(target=fetch_url, args=(url,))
    threads.append(thread)
    thread.start()

# 等待所有线程完成
for thread in threads:
    thread.join()

print("所有URL抓取完成")

3.2 多进程网页抓取

import multiprocessing
import requests

# 定义进程任务函数
def fetch_url(url):
    response = requests.get(url)
    print(f"抓取 {url} 状态码: {response.status_code}")

# 待抓取的URL列表
urls = [
    "https://www.example.com",
    "https://www.python.org",
    "https://www.github.com"
]

# 创建并启动多个进程
processes = []
for url in urls:
    process = multiprocessing.Process(target=fetch_url, args=(url,))
    processes.append(process)
    process.start()

# 等待所有进程完成
for process in processes:
    process.join()

print("所有URL抓取完成")

结论

通过本文的介绍,我们深入了解了Python中的多线程与多进程编程方法,以及如何通过具体案例提升程序的并发性能。希望大家能够灵活运用这些技巧,编写出更加高效和健壮的并发程序。赶快动手试试吧,并别忘了关注我们的博客,收藏这篇文章,更多精彩内容等着你!

关注 全糖冲击 订阅号

标签:实用技巧,thread,Python,print,process,线程,url,进程,多线程
From: https://blog.csdn.net/oLawrencedon/article/details/140291647

相关文章

  • 用Python1000多行代码实现ATM操作系统
    基于Python实现ATM操作系统概要基于Python语言,实现ATM的基本功能,包括查询余额、存款、取款、转账、注册等基本功能。能够实现用户和管理员两种身份识别,管理员有权限对系统做出修改,包括提升用户级别、关闭系统等操作。用户信息保存于user_data.txt文件中,也可自行接入数据库......
  • AES-CBC模式加解密(Python)
    importbase64try:fromCrypto.CipherimportAESfromCrypto.Util.Paddingimportpad,unpadexceptImportError:print('请安装加解密库pycryptodome')classAesSample(object):def__init__(self):self.key='MbQeThWmZq4t6w9......
  • Python是如何进行内存管理的以及引用计数和垃圾回收机制的定义
    Python中的内存管理是一个自动且高效的过程,主要依赖于两种机制:引用计数(ReferenceCounting)和垃圾回收(GarbageCollection,GC)。这些机制共同工作以确保不再被使用的内存能够被及时释放,从而避免内存泄漏。引用计数引用计数是Python中最主要的内存管理机制。Python中的每个对象都......
  • Python基础
    Smiling&Weeping----也许世界上有五千朵和你一模一样的花    但只有你是我独一无二的玫瑰   使用Vscode进行Pythondebug的流程  1.打开文件夹  在VSCode中打开直接打......
  • Python酷库之旅-第三方库Pandas(011)
    目录一、用法精讲25、pandas.HDFStore.get函数25-1、语法25-2、参数25-3、功能25-4、返回值25-5、说明25-6、用法25-6-1、数据准备25-6-2、代码示例25-6-3、结果输出26、pandas.HDFStore.select函数26-1、语法26-2、参数26-3、功能26-4、返回值26-5、说明26-......
  • 提升ECharts图例可读性的实用技巧
    在使用echarts进行数据可视化时,图例(legend)是帮助用户理解图表中各个系列所代表含义的重要组件。然而,在实现过程中,我们可能会遇到一些常见问题,本文将分享一些关于echarts图例分页的注意事项和解决方案。1.图例中出现多余的undefined数据在使用echarts的legend组件时,如果未正确......
  • 深度学习入门:基于Python的理论与实现 (斋藤康毅)
    PDF:访问python33深度学习基础:介绍深度学习的基本概念、原理和发展历史。Python编程:提供使用Python进行深度学习实现的基础知识,包括必要的编程技能和工具。神经网络:解释神经网络的基本结构和工作原理,以及如何构建和训练简单的神经网络。深度学习框架:探讨流行的深度学习......
  • 基于SpringBoot的酒店订房系统+82159(免费领源码)可做计算机毕业设计JAVA、PHP、爬虫、A
    springboot酒店订房系统摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,酒店订房系统当然也不能排除在外。酒店订房系统是以实际运用为开发背景,运用软件工程开发方法,采用springboot技术构建的一个管理系统......
  • python模块导入错误:ImportError: cannot import name
    解决ImportError:cannotimportname'auto_run'from'utils.searxng_utils'问题问题描述在运行某个Python脚本时,遇到了以下错误:ImportError:cannotimportname'auto_run'from'utils.searxng_utils'这个错误表明Python无法从utils.searxng_utils模块中......
  • Python的utils库详解
    Python的utils库并不是一个官方标准库,而是指一系列提供实用功能的工具库或模块,这些库或模块通常包含了一系列帮助开发人员加速日常工作、提高开发效率的工具函数或类。由于Python社区的开放性和活跃性,存在多个不同的utils库,每个库都有其特定的功能和用途。不过,尽管没有一个统一......