百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

新手学Python避坑,学习效率狂飙! 十七、Python 多线程和多进程

moboyou 2025-06-07 16:56 9 浏览

Python 中的多线程和多进程是用于实现并发执行的两种重要机制,以下是对它们的一些分享。

多线程

  • 定义:线程是进程中的一个执行单元,是程序执行的最小单位。在一个进程中可以有多个线程,它们共享进程的资源,如内存空间、文件句柄等。
  • 工作原理:多线程在同一进程内,通过 CPU 的时间片轮转来实现并发执行。每个线程在获得时间片时执行一段代码,然后暂停,让其他线程有机会执行,以此来实现多个任务看似同时进行。
  • 使用场景:适用于 I/O 密集型任务,例如网络请求、文件读写等。因为在这些任务中,线程大部分时间都在等待 I/O 操作完成,而不是占用 CPU 进行计算,所以多个线程可以在等待 I/O 的过程中互相切换,提高程序的整体效率。

示例代码

python

import threading
import time

def print_numbers():
    for i in range(1, 6):
        print(f"Thread 1: {i}")
        time.sleep(1)

def print_letters():
    for char in 'abcde':
        print(f"Thread 2: {char}")
        time.sleep(1)

if __name__ == "__main__":
    # 创建两个线程
    t1 = threading.Thread(target=print_numbers)
    t2 = threading.Thread(target=print_letters)

    # 启动线程
    t1.start()
    t2.start()

    # 等待线程结束
    t1.join()
    t2.join()

    print("Both threads have finished.")

多进程

  • 定义:进程是一个具有独立内存空间和系统资源的执行实体,每个进程都有自己独立的地址空间、文件描述符等资源。
  • 工作原理:操作系统会为每个进程分配独立的资源,并通过调度算法来分配 CPU 时间,使得多个进程可以并发执行。进程之间的通信需要通过特定的机制,如管道、消息队列、共享内存等来实现。
  • 使用场景:适用于 CPU 密集型任务,因为每个进程都有独立的 CPU 资源,多个进程可以同时在不同的 CPU 核心上并行执行,充分利用多核处理器的性能,提高计算效率。

示例代码

python

import multiprocessing
import time

def print_numbers():
    for i in range(1, 6):
        print(f"Process 1: {i}")
        time.sleep(1)

def print_letters():
    for char in 'abcde':
        print(f"Process 2: {char}")
        time.sleep(1)

if __name__ == "__main__":
    # 创建两个进程
    p1 = multiprocessing.Process(target=print_numbers)
    p2 = multiprocessing.Process(target=print_letters)

    # 启动进程
    p1.start()
    p2.start()

    # 等待进程结束
    p1.join()
    p2.join()

    print("Both processes have finished.")

异同分析

  • 相同点目的:都是为了实现程序的并发执行,提高程序的运行效率和响应能力,让多个任务可以同时进行,从而更好地利用计算机资源。并发执行:都可以让多个任务在同一时间内并发执行,给用户一种多个任务同时进行的感觉。
  • 不同点资源占用:多线程共享进程的资源,所以创建和切换线程的开销较小;而多进程每个进程都有独立的资源,创建和销毁进程的开销较大。数据共享:多线程之间可以直接共享进程内的变量和数据结构;多进程之间的数据共享需要通过特定的通信机制,相对复杂。执行效率:对于 I/O 密集型任务,多线程由于可以在等待 I/O 时切换线程,通常效率较高;对于 CPU 密集型任务,多进程可以利用多核处理器并行执行,效率更高。稳定性:多线程中一个线程出现错误可能会影响整个进程;多进程中一个进程出现问题,通常不会影响其他进程,稳定性相对较好。

避坑指南

  • 多线程避坑线程安全问题:多个线程同时访问共享资源时可能会导致数据不一致等问题。例如多个线程同时对一个全局变量进行修改。要解决这个问题,可以使用锁机制来确保同一时间只有一个线程访问共享资源。死锁问题:当多个线程相互等待对方释放资源时,就会发生死锁。例如线程 A 持有锁 1 并等待锁 2,而线程 B 持有锁 2 并等待锁 1。为避免死锁,要合理设计锁的获取顺序,或者使用超时机制来避免无限等待。
  • 多进程避坑进程间通信的复杂性:进程间通信需要使用特定的机制,如管道、消息队列等,如果使用不当可能会导致数据丢失或通信错误。在使用进程间通信时,要确保对通信机制的原理和使用方法有清晰的理解,并且进行充分的测试。资源限制:创建过多的进程可能会导致系统资源耗尽,因为每个进程都需要独立的内存空间和其他系统资源。要根据系统的资源情况合理控制进程的数量。

下面是一个线程安全问题的示例:

python

import threading

# 共享资源
counter = 0
lock = threading.Lock()

def increment_counter():
    global counter
    for _ in range(100000):
        # 获取锁
        with lock:
            counter += 1

def decrement_counter():
    global counter
    for _ in range(100000):
        # 获取锁
        with lock:
            counter -= 1

if __name__ == "__main__":
    # 创建两个线程
    t1 = threading.Thread(target=increment_counter)
    t2 = threading.Thread(target=decrement_counter)

    # 启动线程
    t1.start()
    t2.start()

    # 等待线程结束
    t1.join()
    t2.join()

    print(f"Counter value: {counter}")

在这个示例中,通过使用锁lock来确保在对共享资源counter进行操作时的线程安全。如果不使用锁,那么counter的值可能会因为两个线程同时访问和修改而出现错误。

感谢大家对《新手学Python避坑,学习效率狂飙!》系列的点赞、关注和收藏今天这编是第十七个分享,前面还有十六个,大家可以关注下之前发布的文章。

相关推荐

免费主机|永久免费空间|php虚拟主机|博客主机|论坛主机|免费域名

免费主机|永久免费空间|php虚拟主机|博客主机|论坛主机|免费域名|云主机在出教程之前准备好久,测试搭建轻量论坛无压力选用稳定免费域名免费主机分销给,可以套CDN使用坚持免费时间是大厂不能媲美,刚开...

.NET和Blazor WebAssembly 轻量级博客

简介Blogifier是一个用ASP编写的自托管开源发布平台。.NET和BlazorWebAssembly。它可以用来快速,轻松地建立一个轻量级的,但功能齐全的个人或团体博客。截图支持md教程如果...

等了30年,微软MS-DOS神器重生:用Rust重写、开源斩获9.9k Star、还能跑在Linux上!

整理|苏宓出品|CSDN(ID:CSDNnews)曾经称“开源是毒瘤”时有多么嫌弃,现在“微软开源”就有多么热烈,甚至舍得把很多经典的系统、项目都逐步开源出来。回看过去两年间,微软先是开源...

教程 | 一文搭建你的第一个免费专属博客

我建了一个QQ学习交流群,旨在“分享、讨论、学习、资源分享、就业机会、互联网内推、共同进步!”,感兴趣的可以加一下,也可以添加我的QQ~QQ群:1002821945;QQ号:498073774;前言...

YzmCMS是一款基于YZMPHP开发的一套轻量级开源内容管理系统

YzmCMS是一款基于YZMPHP开发的一套轻量级开源内容管理系统,YzmCMS简洁、安全、开源、实用,可运行在Linux、Windows、MacOSX、Solaris等各种平台上,专注为公司企业、个...

PyPoster, 轻量级的博客发布小工具

引言PyPoster是一个采用Python3.5编写的博客离线发布小工具,GUI采用tkinter框架构建。理论上,可以在安装了Python运行环境的多种平台下使用它。PyPoster目前...

Java和前端哪个更累?(java与前端哪个更推荐)

一、首先前后端开发各是什么?1.前端开发:网站的“前端”是与用户直接交互的部分,包括你在浏览网页时接触的所有视觉内容--从字体到颜色,以及下拉菜单和侧边栏。这些视觉内容,都是由浏览器解析、处理、渲染相...

Linux系统区别英文字母大小写(linux的命令是否区分大小写)

我们一般在Windows系统开发程序并进行功能测试,如果上线的时候选择Windows服务器的话,是什么问题都没有。但是当选择Linux系统的时候,就必须注意Linux系统是严格的区别文字大小。Wind...

原创:带你全面了解和学习PHP(php学的是什么)

PHP能做什么?学习PHP,你应该感到幸运,因为如果你学过其他语言,你就会发现PHP还是相对简单的,如果是初学阶段,你要搞清楚HTML和PHP的概念,之后你完全可以让PHP给你算算一加一等于几,然后在...

我把 Mac mini 托管到机房了:一套打败云服务器的终极方案

本内容来源于@什么值得买APP,观点仅代表作者本人|作者:薯仔不爱吃薯仔我把我积灰的Macmini托管到机房了,有图有真相。虽然画质又渣又昏暗,但是!这就是实锤。作为开发者,谁不想拥有个自己的服...

PHP技能评测(php认证考试)

公司出了一些自我评测的PHP题目,现将题目和答案记录于此,以方便记忆。1.魔术函数有哪些,分别在什么时候调用?__construct(),类的构造函数__destruct(),类的析构函数__cal...

PHP的相似性和差异Ruby ON Rails,Python

就像我们所说的语言是唯一的不同,编程语言也有变化,从知名度、可用性和可靠性。每一种语言都有不同方面的用途。之间的主要相似PHP,RubyonRails和Python是他们都是动态的面向对象的语言。...

查看WordPress站点查询缓慢问题并进行优化教程

大家都知道WordPress是个需要大量查询的程序,查询越多,WordPress网站越慢,如何优化WordPress查询呢?这里我们需要用到QueryMonitor插件,也就是查询监视器插件。在本教...

go 和 php 性能如何进行对比?(go php7 对比)

PHP性能很差吗?每次讲到PHP和其他语言间的性能对比,似乎都会发现这样一个声音:单纯的性能对比没有意义,主要瓶颈首先是数据库,其次是业务代码等等。好像PHP的性能真的不能单独拿出来讨论似的。但其实一...

PHP在做爬虫时的解决方案(php实现爬虫)

爬虫不是一个小众的场景,所以无论是哪个语言,都有很多相应的生态库.这里介绍一下PHP的技术方案和代码量。关键能力对页面的解析能力PHP的官方扩展中有Dom扩展,但是我建议使用electrolinux/...