
好玩好用的Python
文章平均质量分 91
南宫理的日知录
左手人文,双手科技
展开
-
118、Python并发编程:一文搞懂协程的概念及Python原生协程的使用
本文通过对多线程、多进程方案中的并发编程的问题的描述,引出了协程的概念,以及协程主要解决的问题。简单比较了进程、线程、协程各自的特点,并描述了Python中协程的实现历程。最后,通过代码演示了基于async/await的原生协程的使用。原创 2024-11-29 06:15:00 · 1243 阅读 · 0 评论 -
116、Python并发编程:使用进程池实现多进程编程的两种方法
本文首先介绍了使用进程池的优势,以及其适用的业务场景。然后,分别介绍了基于multiprocessing.Pool和concurrent.futures.ProcessPoolExecutor的进程池的创建和使用。最后,简单比较了两种实现方式。原创 2024-11-27 06:45:00 · 660 阅读 · 0 评论 -
117、Python并发编程:一文搞懂Python并发模型的关键知识点
前面的文章中,已经对Python并发编程中的多线程、多进程进行了详细的介绍,也分别对相关内置模块的使用进行了演示。由于并发编程的内容比较多,本文打算就Python并发模型中的核心知识点进行一个系统的梳理,从而对并发模型有更加系统、深入的理解。原创 2024-11-27 12:45:00 · 518 阅读 · 0 评论 -
115、Python并发编程:共享内存太复杂?通过Manager简化对象共享
本文简单介绍了Manager模块的使用,并简单提及了关于Manager模块的底层实现细节。最后,对比了共享内存的使用,给出结论,“Manger是一种用起来像共享内存,底层实现上像Queue和Pipe的IPC机制”。原创 2024-11-25 06:45:00 · 1882 阅读 · 0 评论 -
114、Python并发编程:一文搞懂为什么以及如何使用共享内存
本文以队列和管道在IPC中的性能等方面的局限性,引入了共享内存这种IPC机制。分别介绍了共享内存的概念,共享内存的使用,以及共享内存的注意事项。共享内存在提高性能的同时,也带来了使用上的复杂性。原创 2024-11-23 07:00:00 · 644 阅读 · 0 评论 -
113、Python并发编程:使用管道Pipe实现简单双向的数据传输
本文简单介绍了Python中Pipe的使用,Pipe两个进程间进行简单、小量数据的双向传递等相关特性,使得Pipe很适合两个进程的状态同步、命令-响应等场景的需求实现,代码编写起来,也特别简单、易读。原创 2024-11-22 06:45:00 · 841 阅读 · 0 评论 -
112、Python并发编程:Queue实现进程通信,此Queue非彼Queue
进程间通信(Inter-Process Communication, IPC)是并发编程中一个很核心的概念。虽然在编程模型上,多进程与多线程在代码编写上有很多的相似性,但是在进程间通信上,会存在很大的不同。1、数据隔离由于每个进程都有自己独立的内存空间,因此进程之间不能直接访问彼此的内存,多线程中通过共享变量的方式进行通信的方式,显然就行不通了。进程间的通信必须依靠特定的机制来进行,比如消息队列、管道、共享内存等。2、IPC机制的选择1)管道(Pipe)原创 2024-11-21 06:15:00 · 561 阅读 · 0 评论 -
111、Python并发编程:使用multiprocessing模块编写可移植的多进程
如同多线程编程中,通过Thread类实现线程对象的抽象封装。在Python中,类比Thread类,创建了Process类,实现了对进程对象的抽象封装,从而可以更加轻易地管理进程对象。在真正使用Process类之前,首先来看下Process类中的常用方法和属性。1、__init__()初始化方法如同Thread构造函数的用法一样,通常只需要传入target参数和args参数,即可快速创建一个进程对象。2、is_alive()方法用于判断进程是否在运行,仍在运行,则返回True,否则False。原创 2024-11-20 06:15:00 · 733 阅读 · 0 评论 -
110、Python并发编程:利用os模块轻松实现多进程编程
本文通过对多线程和多进程的比较,一方面对多线程的内容做了个梳理总结,另一方面也对多进程的内容,做了一个全局性的引入。最后,通过os模块中相关进程管理的函数,简单演示了多进程。原创 2024-11-19 06:15:00 · 1293 阅读 · 0 评论 -
109、Python并发编程:多线程组件如何选,适用的才是最好的
1、Lock,用于实现共享资源保护的核心原语。2、Condition,用于多线程间的通知机制。3、Semaphore,强调有限数量资源的合理共享。4、Event,用于线程间的信号通知,控制执行顺序。5、Queue,用于线程间的数据的安全传递,作为生产者-消费者模型的基础。6、ThreadPoolExecutor,可以简化大量短时任务的管理和执行,提高资源利用率。在实际使用中,选择合适的同步原语和并发模式,可以显著提高代码的性能及可维护性。原创 2024-11-16 10:16:53 · 1009 阅读 · 0 评论 -
108、Python并发编程:一文搞懂队列及Python中的线程安全队列
如果有科班出身的同学,一定曾经被本科的一门核心基础课程——《数据结构和算法》折磨过。读书期间,为了考试,也许只是死记硬背知识点了,不晓得实际上有什么用。但是,有了一定的工作实践之后,再回看哪些基础课程,一定会有更加深刻的体会。队列的概念及设计理念队列(Queue)是一种非常重要的数据结构,它提供一种先进先出(FIFO)的数据处理方式。队列再许多计算机科学和实际应用中都发挥着至关重要的作用。队列的设计理念主要有:1、先进先出(FIFO):队列遵循先进先出的原则,最先进入队列的元素最先被处理。原创 2024-11-15 06:15:00 · 883 阅读 · 0 评论 -
107、Python并发编程:失败自动重试,一次搞懂简单实用的Timer
Timer是Python的threading模块中提供的一个定时器的组件,可以实现在指定的时间间隔后执行一个函数。从源码看,Timer模块的实现非常简单。1、Timer的实现,主要是通过继承Thread类型,实现相关线程实例化、调度的基本功能。2、内部持有一个Event事件对象,通过对象的指定timeout的wait()方法调用,实现等待指定时间再执行的效果。3、提供cancel()方法,用于设置内部事件对象的标志位,从而终止等待执行。原创 2024-11-14 06:30:00 · 876 阅读 · 0 评论 -
106、Python并发编程:深入浅出理解线程池的内部实现原理
本文围绕着ThreadPoolExecutor和Future对象的源码,深入介绍了相应的内部实现,以及线程池任务的处理全流程。对Future对象的设计理念和基础操作,也做了相应的展开介绍。这些都是理解线程池并发编程的核心,希望您能有所收获。原创 2024-11-13 06:15:00 · 571 阅读 · 0 评论 -
105、Python并发编程:化繁为简,通过线程池轻松实现多线程编程
本文首先介绍了一个完整的并发编程的解决方案应该具备的能力,然后引出了Python中通过线程池提供的一个更加完整的多线程编程的解决方案的支持,并简单介绍了线程池的常用方法。最后通过一个并发计算斐波那契数列的计算的示例,演示了线程池的使用。原创 2024-11-12 06:30:00 · 595 阅读 · 0 评论 -
104、Python并发编程:基于事件Event实现多线程间的同步
在Python的多线程编程中,Event是一个用于实现线程间通信的同步原语。它提供了一种机制,能够允许一个线程通知一个线程或多个线程某个等待事件的发生。Event对象维持了一个标记,这个标记可以被置为“设置”或者“未设置”。从Event的源码中,可以看出Event内部持有一个Condition对象,相关的实现也是基于Condition来实现的。1、set()方法:将事件对象标记为“设置”,并通知所有等待该事件的线程。2、clear()方法:将事件对象标记为“未设置”,使得后续的等待变得有效。原创 2024-11-11 06:00:00 · 892 阅读 · 0 评论 -
103、Python并发编程:使用信号量Semaphore实现资源有限的并发场景
本文首先回顾了之前介绍到的锁、条件变量和队列各自所能应对的并发同步场景,引出了资源有限的同步场景中的主角Semaphore,分别介绍了Semaphore的设计实现及使用案例。原创 2024-11-09 06:30:00 · 1079 阅读 · 0 评论 -
102、Python并发编程:Queue与生产者消费者模型实现解耦、协作
本文通过一个上下游任务协同的需求,引入了生产者消费者模型,同时通过两种方式模拟了生产者消费者模型的实现。最后,简单比较了deque和Queue的主要区别和适用场景。原创 2024-11-08 06:45:00 · 1534 阅读 · 0 评论 -
101、Python并发编程:Condition实现“排排坐分果果”的复杂同步
本文简单介绍了Condition的内部设计原理、Condition的核心方法,以及在使用Condition实现多线程的复杂同步需求时的注意事项。以上,就是本文的全部内容了,希望对您有所帮助!原创 2024-11-07 06:45:00 · 579 阅读 · 0 评论 -
100、Python并发编程:保护临界资源的最简单方式,加锁
本文简单介绍了使用锁的必要性、锁的底层实现原理,以及Python中关于互斥锁、可重入锁的支持,并通过具体的代码示例,演示了两种的锁的基本使用。原创 2024-11-06 06:15:00 · 676 阅读 · 0 评论 -
99、Python并发编程:多线程的问题、临界资源以及同步机制
多线程编程的学习,多线程模型的相关线程实现只是基础,关于线程的同步机制才是我们后续需要学习的核心。本文以多线程的引入所带来的问题展开,分别介绍了临界资源、临界区的概念,以及解决多线程问题的同步机制的各种实现。原创 2024-11-05 06:30:00 · 1021 阅读 · 0 评论 -
98、Python并发编程:Python的伪多线程、GIL以及自由线程特性
本文简单介绍了GIL的存在,通过代码演示了Python中多线程不能真正并发的现象。最后试用了Python3.13中的自由线程模式,对比了移除GIL后的多线程和单线程的执行效率。原创 2024-11-01 06:30:00 · 1968 阅读 · 0 评论 -
97、Python并发编程:多线程实现的两种方式
了解了Thread类中常用的方法之后,我们来看看在Python中实现多线程编程的两种方式(在其他语言中,也基本是类似的方式)。1、直接使用Thread来实例化线程对象1)自定义函数封装线程要实现的业务行为。2)将自定义函数作为target参数,相应的函数实参作为args参数,调用Thread的__init__()方法,来实例化线程对象。3)调用线程对象的start()方法来启动子线程的执行。lines = 0print(f'{name}开始写代码')原创 2024-10-31 06:30:00 · 711 阅读 · 0 评论 -
96、Python并发编程:三个核心概念及Python并发编程模型
本文简单介绍了程序到执行的一个大概的过程,辨析了程序、进程、线程的概念,同时简单介绍了Python中的并发编程模型。原创 2024-10-30 06:30:00 · 1275 阅读 · 0 评论 -
95、Python并发编程:程序执行的过程及并发与并行
本文简单介绍了CPU执行程序的过程,对比了并发和并行这两个容易混淆的概念,在后续的并发编程中,需要始终注意到通过并发编程,不一定能够提升程序的执行效率,还是需要具体情况具体分析。原创 2024-10-24 06:45:00 · 632 阅读 · 0 评论 -
94、Python之异常:自定义异常以满足业务个性化需求
每个技术特性,没有绝对的好与坏,都有其适用的场景。所以,前面的文章中,笔者也一直在提及,学习技术特性,关键是找到实际工作中的适用场景,否则,只是单纯地记忆一些编程语言的语法,其实是没有太大意义的。内置异常类的体系已经很丰富了,能够满足绝大部分的异常管理的场景需求。但是,自定义异常,还是有其存在的必要性的。1、提高代码的可读性和可维护性:自定义异常可以使代码更加清晰和可读,通过自定义特定的异常类型,可以更加明确地描述不同的错误情景,从而使得代码更容易理解和维护。2、更精确的异常管理。原创 2024-10-23 06:30:00 · 673 阅读 · 0 评论 -
93、Python之异常:了解常见的内置异常,遇到不慌
本文简单梳理了Python中的异常类的继承体系,然后就笔者日常工作中遇到的比较常见的异常,做了一个简单的介绍。原创 2024-10-18 06:45:00 · 1455 阅读 · 0 评论 -
92、Python之异常:异常的概念及异常处理机制
本文首先介绍了Python中异常的概念,然后介绍了Python中异常的两种分类,最后介绍了在Python中通过try...except...else...finally进行非致命异常的处理机制,以及应对致命异常的一些策略。以上就是本文的全部内容了,希望对您有所帮助。原创 2024-10-17 06:45:00 · 545 阅读 · 0 评论 -
91、Python之异常:十分力气,九分花在了应对错误上
本文主要介绍了计算机科学中关于错误的处理应对策略,分别介绍了检错、排错、容错的内容。在真正进行Python中异常的内容的学习之前,先有这些思想上的理念,还是很有必要的。以上就是本文的全部内容,下一篇文章,开始聊聊Python中的异常处理。原创 2024-10-16 06:45:00 · 522 阅读 · 0 评论 -
90、Python之鸭子类型:for循环的本质,进一步解析迭代协议
本文首先简单回顾了Python中迭代协议的概念,同时介绍了两个内置函数iter()和next()。然后介绍了Python中for循环的本质及详细执行过程。最后通过自定义可迭代对象、迭代器来验证了for循环的执行过程,以及通过两个内置函数,使用while循环模拟for循环的执行过程。以上就是本文的全部内容了,希望对您能有所帮助。原创 2024-10-12 06:30:00 · 584 阅读 · 0 评论 -
89、Python之鸭子类型:可迭代对象、迭代器与迭代协议
print('__iter__被调用')print('__next__被调用')else:my_iterator = MyIterator(['张三', '李四', '大头儿子'])执行结果:1、在for循环开始之初,迭代器的__iter__()方法会被调用一次,之后就不再调用了。2、在对迭代器进行遍历的过程中,每次是通过__next__()方法的调用,获取其中的元素的。需要说明的是,上面的代码只是用于演示迭代器的自定义实现,本身没有实用意义,毕竟我们通过for循环可以直接对列表进行遍历的。原创 2024-10-11 06:15:00 · 1506 阅读 · 0 评论 -
88、Python之鸭子类型:函数是对象,对象也可以像函数一样使用
本文主要介绍了__call__()这个魔术方法的使用,定义出的可调用对象,可以像函数一样被调用。可调用对象在函数对象化、状态的管理、行为的动态配置等场景中都是比较适用的。此外,比较了可调用对象与闭包这两者各自的优缺点。在具体使用中如何进行选择,就是见仁见智了。原创 2024-10-10 06:30:00 · 1454 阅读 · 0 评论 -
87、Python之鸭子类型:自定义容器,用起来像容器,它就是容器
在各种编程语言中,容器类型都是非常有用、非常核心的数据结构,在各种业务场景中,都有可能用到容器类型。所谓容器类型(Container Types)是指能够包含其他对象的集合类型,它们可以存储多个元素,并提供访问和操作这些元素的方式。在Python中,常见的容器类型有:列表(list)、元组(tuple)、字典(dict)、集合(set)等。这些内容我们在前面的文章中都已经有所介绍,感兴趣的可以自行查阅下历史文章。原创 2024-10-09 06:15:00 · 580 阅读 · 0 评论 -
86、Python之鸭子类型:即便行为大于类型,还是要聊一下类型转换
每种编程语言中,都有“类型”的概念。类型与行为的关系,有点像《论语》中“文”和“质”的关系。不能绝对的说,哪个一定更加重要。两者的关系,更应该是“质胜文则野,文胜质则史,文质彬彬,然后君子”的感觉。有类型,就一定存在类型转换。所谓的“类型转换”,是指将一种类型转换为另一种类型的过程。在编程中,类型转换是一项重要操作,因为不同的数据类型有各自的特点和用途。很多时候,类型本身,即直观地告诉了我们该类型的对象所应当具有的行为以及所能够支持的操作。原创 2024-09-30 07:55:55 · 927 阅读 · 0 评论 -
85、Python之鸭子类型:魔术方法&深拷贝和浅拷贝
本文介绍了三种对象“拷贝”的方式,也就是赋值、浅拷贝、深拷贝。对比了浅拷贝和深拷贝的运行机制。最后,简单演示了通过魔术方法__copy__()和__deepcopy__()进行自定义浅拷贝和深拷贝行为。原创 2024-09-29 16:53:58 · 955 阅读 · 0 评论 -
84、Python之鸭子类型:魔术方法&自定义类型也可以实现加减乘除
接下来,简单通过代码演示一下几个常见的算术运算相关的魔术方法的使用。self.x = xself.y = y# 正向加# 反向减# 原地加# 一元运算print(v1)print(v2)print(v3)print(v4)v5 = -v2print(v5)v5 += v1print(v5)本文简单介绍了算术运算符的分类,比如:一元运算符、二元运算符、增量运算符、反向运算符等。然后,又列举了常见的算术运算符对应的魔术方法。原创 2024-09-29 09:38:02 · 1063 阅读 · 0 评论 -
83、Python之鸭子类型:比较运算符重载&自定义类型实现比较运算
本文简单介绍了编程中的比较运算,以及运算符重载的概念。然后,结合Python中的魔术方法,介绍了Python自定义类型,支持比较运算的实现。原创 2024-09-27 13:53:35 · 1213 阅读 · 0 评论 -
82、Python之鸭子类型:一次搞懂with与上下文装饰器
所谓“上下文管理器(Context Manager)”在Python中是一种用于管理资源的对象,其中定义了进入上下文和退出上下文的行为。通过实现__enter__()和__exit__()两个魔术方法,上下文管理器可以更加简洁、安全地进行资源的管理。上下文管理器可以确保资源在使用完毕后被正确地释放,即便发生异常。这种机制可以有效降低资源管理的复杂度,尤其是能够有效避免资源泄露和处理资源管理中的复杂异常场景等。学习一个特性,首先必须要问的,一定是学这个东西有什么用。原创 2024-09-27 06:15:00 · 940 阅读 · 0 评论 -
81、Python之鸭子类型:从魔法函数看对象的字符串呈现
从print()函数的内部作用机制,我们已然可以知道,通过魔法函数__str__()和__repr__(),可以实现自定义对象字符串表示的行为。这也是内部类型,比如容器等,等够在print()输出时,呈现出更加人性化的内容,更加便于开发者的使用、调试。zs = DaGongRen('张三', 18)print(zs)执行结果:从执行结果可以看出,print(obje)和str(obj),都已经自动调用了我们自定义的__str__()方法。当然,这里我们换成__repr__()方法,也是可以的。原创 2024-09-26 14:23:54 · 806 阅读 · 0 评论 -
80、Python之鸭子类型:魔术方法,Python魔法世界的基石
本文接着鸭子类型的内容,就魔术方法的概念和设计理念进行了展开的介绍。同时,对Python中常用的魔术方法的分类,做了简单的说明。最后简单介绍了使用魔术方法的作用和价值,以及在实际使用魔术方法时,应该注意的要点。原创 2024-09-26 08:29:32 · 1001 阅读 · 0 评论 -
79、Python之鸭子类型:没有听过鸭子类型?关键在于认知的转变
所谓“鸭子类型(Duck Typing)”,是一种动态类型系统的编程概念。其核心思想来自于詹姆斯·惠特科姆·莱利的鸭子测试:“如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子”。换句话说,在鸭子类型中,对象的有效性不依赖于其显式的类型,而是依赖于对象是否具有所需要的属性和方法。可以粗略的理解为,所谓的实体的强类型,更像是一种标签。而我们在实际业务场景中,需要的是某些能力、行为。原创 2024-09-25 08:10:40 · 1180 阅读 · 0 评论