自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

编程的朝圣之路

学习编程不是要成为程序员,而是要理解这个时代。

  • 博客(48)
  • 收藏
  • 关注

原创 协程,Python 中实现多任务耗资源最小的方式

协程,又称微线程,纤程。英文名 Coroutine。协程是 Python 中另外一种实现多任务的方式,只不过比线程更小,占用更小执行单元(理解为需要的资源)。为啥说它是一个执行单元,因为它自带 CPU 上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量等信息,然后切换到另外一个函数中执行,注意不是通过调用函数的方式做到的,并且切换的次数以及什么

2020-10-19 08:03:33 374

原创 子进程太多,还是要用到进程池 Pool

和选用线程池来关系多线程类似,当程序中设置到多进程编程时,Python 提供了更好的管理多个进程的方式,就是使用进程池。在利用 Python 进行系统管理的时候,特别是同时操作多个文件目录,或者远程控制多台主机,并行操作可以节约大量的时间。当被操作对象数目不大时,可以直接利用 multiprocessing 中的 Process 动态生成多个进程,十几个还好,但如果是上百个,上千个目标,手动的去限制进程数量却又太过繁琐,此时可以发挥进程池的功效。Pool可以提供指定数量的进程供用户调用,当有新的请求提

2020-10-15 08:18:00 285

原创 Python 中通过队列来实现进程间通信

Python程序中,在进程和进程之间是不共享全局变量的数据的。我们来看一个例子:from multiprocessing import Processimport osimport timenums = [11, 22]def work1(): """子进程要执行的代码""" print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums)) for i in range(3): nums.appen

2020-10-14 08:15:18 246

原创 Python 中进程和线程的用法基本一样

一、进程的创建我们先来回忆下之前多线程的实现。import threadingimport timedef test1(): while True: print("1------") time.sleep(1)def test2(): while True: print("2------") time.sleep(1)def main(): t1 = threading.Thread(target=te

2020-10-12 08:15:27 129

原创 进程的概念,系统资源分配的单元

程序:所谓的程序,是硬盘上的一个可执行文件,是静态的。进程:一个程序运行起来后,代码加上用到的资源称之为进程,它是操作系统分配资源的基本单元。一个程序,对应进程可以有多个。多任务不仅可以通过线程来实现,进程也是可以的。进程的状态实际工作中,任务数往往大于 cpu 的核数,即一定有一些任务正在执行,而另外一些任务在等待 cpu 进行执行,因此导致了进程有不同的状态。就绪状态:运行的条件都已经满足,正在等在cpu执行。执行状态:cpu正在执行其功能。等待状态:等待某些条件满足,例如一个程序

2020-10-05 08:13:00 1064

原创 Python 为什么要用线程池?

一、为什么要使用线程池多线程的情况下确实可以最大限度发挥多核处理器的计算能力,提高系统的吞吐量和性能。但是如果随意使用多线程,对系统的性能反而有不利影响。比如下面的情况:创建线程是需要时间的,假设线程创建所需时间为T1,线程执行任务时间为T2,线程销毁时间为T3,而往往T1+T3>T2。所以频繁创建和销毁线程也会消耗大量的时间。如果有任务来了,再去创建线程的话效率比较低。其次线程也需要占用内存空间,线程池可以管理控制线程,线程是稀缺资源,如果无休止的创建会消耗系统资源,还会降低系统稳定性。

2020-09-30 08:03:55 192

原创 Python 多线程中死锁了怎么办?

一、死锁在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。就好像在现实社会中,男女双方在闹别扭之后,都在等待对方先道歉。如果双方都这样固执地等待对方先开口,弄不好,就 over 了。尽管死锁很少发生,但一旦发生就会造成应用的停止响应。下面看一个死锁的例子:import threadingimport timeclass MyThread1(threading.Thread): def run(self): # 对mut

2020-09-29 07:56:12 348

原创 互斥锁解决 Python 中多线程共享全局变量的问题

一、同步概念同步就是协同步调,按预定的先后次序进行运行。如:你说完,我再说。"同"字从字面上容易理解为一起动作。其实不是,在这里,"同"字应是指协同、协助、互相配合。线程同步,可理解为线程A和B一块配合,A执行到一定程度时要依靠B的某个结果,于是停下来,示意B运行;B执行,再将结果给A;A再继续操作。之前我们遇到过,如果多个线程共同对某个数据修改,则可能出现不可预料的结果,为了保证数据的正确性,需要对多个线程进行同步。解决线程同时修改全局变量的方式我们先把上次那个问题再看下。import t

2020-09-28 08:09:48 267 1

原创 Python 中多线程共享全局变量的问题

在之前,我们讲过了,Python 中多个线程之间是可以共享全局变量的数据的。但是,多线程共享全局变量是会出问题的。假设两个线程 t1 和 t2 都要对全局变量 g_num (默认是0)进行加1运算,t1 和 t2 都各对 g_num 加10次,g_num 的最终的结果应该为20。但是由于多线程是同时操作,有可能出现下面情况:在 g_num=0 时,t1 取得 g_num=0。此时系统把 t1 调度为”sleeping”状态,把t2转换为”running”状态,t2 也获得 g_num=0。然后 t

2020-09-25 08:11:11 365

原创 Python 中多个线程之间是共享全局变量的

一、多线程共享全局变量首先我们来回忆下在函数中修改全局变量的情况。在一个函数中,对全局变量进行修改的时候,到底是否需要使用 global 进行说明,要看是否对全局变量的执行指向进行了修改。如果修改了执行指向,即让全局变量指向了一个新的地方,那么必须使用 global。如果仅仅是修改了指向的空间中的数据,此时不是必须要使用 global。我们来看一个例子,在这个例子中,让一个子线程对全局变量 +1 操作,另一个子线程只打印全局变量,看看数据是否共享。from threading import T

2020-09-24 08:25:45 2987

原创 如何改变 Python 中线程的执行顺序

一、主线程会等待所有的子线程结束后才结束首先我看下最普通情况下,主线程和子线程的情况。import threadingfrom time import sleep, ctimedef sing(): for i in range(3): print("正在唱歌...%d" % i) sleep(1)def dance(): for i in range(3): print("正在跳舞...%d" % i) sle

2020-09-23 08:07:19 553

原创 5个状态,Python 中线程的生命周期

当程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程。那么,CPU 在轮换执行线程的过程中,即从创建到消亡的整个过程,可能会历经 5 种状态,分别是新建、就绪、运行、阻塞和死亡。线程的新建状态无论是通过 Thread 类直接实例化对象创建线程,还是通过继承自 Thread 类的子类实例化创建线程,新创建的线程在调用 start() 方法之前,不会得到执行,此阶段的线程就处于新建状态。线程的就绪状态当位于新建状态的线程调用 start() 方法后,该线程就转换到就绪状态。

2020-09-22 08:15:07 248

原创 线程,Python 实现多任务的方式之一

我们怎么让一个 Python 程序里边实现多任务呢?实现多任务可以有多种方式,这里我们先了解使用线程的方式实现多任务。线程是实现多任务的一种的手段。其实用的是 threading 模块,threading 模块里有一个类叫 Thread。Python 的 thread 模块是比较底层的模块,Python 的 threading 模块是对 thread 做了一些包装的,可以更加方便的被使用。一、通过构造器传函数的方式创建线程我们先来看一个实例:import timeimport threadi

2020-09-17 08:11:14 78

原创 什么是 Python 程序中的多任务?

现实生活中,有很多场景中的事情是同时进行的,比如开车的时候,手和脚共同来驾驶汽车,再比如唱歌跳舞也是同时进行的。以上这些可以理解为多任务。那在程序中怎么能做到多任务,它有什么好处?接下来我们来看看没有多任务的程序是什么效果。import timedef sing(): for i in range(5): print("正在唱...") time.sleep(1)def dance(): for i in range(5):

2020-09-16 08:16:34 125

原创 用 Python 实现最简单的 tcp 文件下载

什么是下载?首先客户端会问服务器,有没有一个xxx的文件啊?服务器开始寻找,找到后对客户端说有,然后客户端在本地新建一个文件,客户端从服务器收到一点数据,就写进这个文件中,再收到一点数据,再写入这个文件中,只要把所有的接收到的数据都写入到这个文件中,就完成了下载的操作。所以下载需要2个部分。服务器的发送方和客户端的接收方。我们这里不考虑复杂的情况。什么限速啊,验证啊,文件大小…只实现最简单的逻辑。客户端参考代码import socketdef main(): # 创建socket

2020-09-15 08:56:04 294

原创 Python 实现 tcp 网络程序,发送、接收数据

TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。TCP通信需要经过创建连接、数据传送、终止连接三个步骤。TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中打电话。tcp网络通信模型一、tcp客户端构建流程tcp的客户端要比服务器端简单很多。import socket# 1.创建sockettcp_socket =

2020-09-14 08:42:57 2422

原创 Python 实现 udp 网络程序,发送、接收数据

Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。udp网络程序模型图。接下来,我们用 python 代码实现udp数据的发送和接收。一、udp网络程序,发送数据流程:创建客户端套接字发送数据关闭套接字import socketdef main(): # 1.创建一个udp套接字 udp_socket =

2020-09-11 08:43:22 1403

原创 socket是什么?套接字是什么?

网络编程就是编写程序使两台联网的计算机相互交换数据。那么,这两台计算机之间用什么传输数据呢?首先你肯定先需要物理连接嘛。在此基础上,只需要考虑如何编写数据传输程序。看似很麻烦,但实际上这点不用愁,因为操作系统已经提供了 socket。即使对网络数据传输的原理不太熟悉,我们也能通过 socket 来编程。一、什么是socketsocket 的原意是“插座”,在计算机通信领域,socket 被翻译为“套接字”,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收

2020-09-10 08:42:38 1372

原创 三步搞定 Python 中的文件操作

当程序运行时,变量是保存数据的好方法,但变量、序列以及对象中存储的数据是暂时的,程序结束后就会丢失,如果希望程序结束后数据仍然保持,就需要将数据保存到文件中。Python 提供了内置的文件对象,以及对文件、目录进行操作的内置模块,通过这些技术可以很方便地将数据保存到文件(如文本文件等)中。一、文件的概念在计算机中,文件是以二进制的方式保存在磁盘上的。文件分为文本文件和二进制文件。1、文本文件可以使用文本编辑软件查看,本质上还是二进制文件,例如:python 的源程序。2、二进制文件保存的内容

2020-09-09 09:15:33 984

原创 Python 中引入多个模块,包的概念

实际开发中,一个大型的项目往往需要使用成百上千的 Python 模块,如果将这些模块都堆放在一起,势必不好管理。而且,使用模块可以有效避免变量名或函数名重名引发的冲突,但是如果模块名重复怎么办呢?因此,Python提出了包(Package)的概念。一、包的概念和基本使用什么是包呢?简单理解,包就是文件夹,只不过在该文件夹下必须存在一个名为“__init__.py” 的文件。每个包的目录下都必须建立一个 __init__.py 的模块,可以是一个空模块,可以写一些初始化代码,其作用就是告诉 Pyth

2020-09-08 12:46:19 602

原创 Python 中引入一个文件,模块的概念

Python 提供了强大的模块支持,主要体现在,不仅 Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块。通过这些强大的模块可以极大地提高开发者的开发效率。一、模块的概念模块,英文为 Modules,是 Python 程序架构的一个核心概念。至于模块到底是什么,可以用一句话总结:模块就是 Python 程序,每一个以扩展名 py 结尾的 Python 源代码文件都是一个模块。换句话说,任何 Python 程序都可以作为模块。模块可以比作一

2020-09-07 14:00:00 251

原创 异常,Python 中错误的处理方式

开发人员在编写程序时,难免会遇到错误,有的是编写人员疏忽造成的语法错误,有的是程序内部隐含逻辑问题造成的数据错误,还有的是程序运行时与系统的规则冲突造成的系统错误,等等。总的来说,编写程序时遇到的错误可大致分为 2 类,分别为语法错误和运行时错误。语法错误,也就是解析代码时出现的错误。当代码不符合 Python 语法规则时,Python解释器在解析时就会报出 SyntaxError 语法错误,与此同时还会明确指出最早探测到错误的语句。语法错误多是开发者疏忽导致的,属于真正意义上的错误,是解释器无法容忍

2020-09-02 09:36:09 425

原创 一文详述 Python 中的 property 语法

在大多数语言的程序中,一个类,每有一个属性,就会对应 setter 和 getter,基本都是标配。示例:class Money(object): def __init__(self): self.__money = 0 def getMoney(self): return self.__money def setMoney(self, value): if isinstance(value, int):

2020-09-01 08:22:38 367

原创 Python 的类其实是一个特殊的对象

Python 中的类是一个特殊的对象。Python 中一切皆对象:class AAA:定义的类属于类对象。obj1 = AAA(): 属于实例对象。在程序运行时,类同样会被加载到内存,类是一个特殊的对象——类对象。类对象在内存中只有一份,使用一个类可以创建出很多个对象实例。除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法。通过 ‘类名.’ 的方式可以访问类的属性或者调用类的方法。一、类属性类属性就是给类对象中定义的属性,通常用来记录与这个类相关的特征,类属性不会用于记录具体

2020-08-31 08:58:07 161

原创 Python 面向对象3大特征之多态

多态是将不同的对象调用相同的方法,产生不同的执行结果。多态可以增加代码的灵活度,以继承和重写父类方法为前提,是调用方法的技巧,不会影响到类的内部设计。我们都知道,Python 是弱类型语言,其最明显的特征是在使用变量时,无需为其指定具体的数据类型。示例:在 Dog 类中封装方法 game,普通狗只是简单的玩耍。定义 XiaoTianDog 继承自 Dog,并且重写 game 方法,哮天犬需要在天上玩耍。定义 Person 类,并且封装一个和狗玩的方法,在方法内部,直接让狗对象调用 game 方法

2020-08-28 08:28:04 148

原创 Python 面向对象3大特征之继承

继承机制经常用于创建和现有类功能类似的新类,又或是新类只需要在现有类基础上添加一些成员(属性和方法),但又不想直接将现有类代码复制给新类。也就是说,通过使用继承这种机制,可以轻松实现类的重复使用,相同的代码不需要重复的编写,提高开发的效率。一、单继承继承的概念:子类拥有父类的所有方法和属性。不使用继承分析:Animal 中有4个方法,Dog 类中有5个方法,Dog 类中的4个方法可以直接从 Animal 中复制粘贴过来,Dog 类其实只需要单独开发 bark 方法。XiaoTianQuan 类

2020-08-27 10:07:46 179

原创 Python 私有属性也可以在外部访问?

在实际开发中,对象的某些属性或方法可能只希望在对象的内部被使用,而不希望在外部被访问到。私有属性就是对象不希望公开的属性。私有方法就是对象不希望公开的方法。在定义属性或方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法。示例:class Women: def __init__(self, name): self.name = name self.__age = 18 def __secret(self):

2020-08-26 10:43:46 2071

原创 Python 面向对象3大特征之封装

封装是面向对象编程的一大特点。面向对象编程的第一步 —— 根据职责将属性和方法封装到一个抽象的类中,外界使用类创建对象,然后让对象调用方法,对象方法的细节都被封装在类的内部。简单的理解封装,即在设计类时,刻意地将一些属性和方法隐藏在类的内部,这样在使用此类时,将无法直接以“类对象.属性名”或者“类对象.方法名(参数)”的形式调用这些属性或方法,而只能用未隐藏的类方法间接操作这些隐藏的属性和方法。就好比使用电脑,我们只需要学会如何使用键盘和鼠标就可以了,不用关心内部是怎么实现的,因为那是生产和设计人员该

2020-08-25 10:24:28 195

原创 Python 类和对象初步入门

Python 语言在设计之初,就定位为一门面向对象的编程语言,“Python 中一切皆对象”就是对 Python 这门编程语言的完美诠释。类和对象是 Python 的重要特征,相比其它面向对象语言,Python 很容易就可以创建出一个类和对象。同时,Python 也支持面向对象的三大特征:封装、继承和多态。在 Python 中 对象几乎是无所不在的,我们之前学习的变量、数据、函数都是对象。类仅仅充当图纸的作用,本身并不能直接拿来用,而只有根据图纸造出的实际物品(对象)才能直接使用。因此,Python

2020-08-24 09:23:39 192

原创 初识面向对象(OOP)的基本概念

面向对象编程 —— Object Oriented Programming 简写 OOP。如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于更容易的学习 Python 的面向对象编程。面向对象编程是在在面向过程编程的基础上发展来的,它比面向过程编程具有更强的灵活性和扩展性。面向对象编程是程序员发展的分水岭,很多初学者会因无法理解面向对象而放弃学习编程。一、面向过程和面向对象的基本概念1、面向过程把完成某一

2020-08-23 08:48:06 351

原创 递归,Python 函数编程技巧之一

函数的递归函数调用自身的编程技巧称为递归。函数内部可以调用其他函数,当然在函数内部也可以调用自己。递归的特点函数内部的代码是相同的,只是针对参数不同,处理的结果不同。当参数满足一个条件时,函数不再执行,这个非常重要,通常被称为递归的出口,否则会出现死循环。示例代码:def sum_numbers(num): print(num) # 递归的出口很重要,否则会出现死循环 if num == 1: return # 自己调用自己 sum

2020-08-20 14:07:29 167

原创 Python代码重用之函数入门

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。在开发程序时,使用函数可以提高编写的效率以及代码的重用。一、函数的基本使用函数的使用就是定义和调用两个步骤。函数的定义定义函数的格式如下:def 函数名(): 函数封装的代码 ……说明:1、def 是英文 define 的缩写。2、函数名称应该能够表达函数封装代码的功能,方便后续的调用。3、函数名称的命名应该符合标识符的命名规则。可以由字母、下划线和数字组成不能以数字开头不能与关键字重名函数

2020-08-19 13:10:23 277

原创 Python容器类型公共方法汇总

以下公共方法支持列表,元组,字典,字符串。内置函数Python 包含了以下内置函数:函数描述备注len(item)计算容器中元素个数del(item)删除变量del 有两种方式max(item)返回容器中元素最大值如果是字典,只针对 key 比较min(item)返回容器中元素最小值如果是字典,只针对 key 比较注意:字符串比较符合以下规则: “0” < “A” < “a”切片切片使用索引值来限定范围,从一个大的字符串中

2020-08-18 08:16:57 182

原创 Python最常用的数据类型——字符串

字符串就是一串字符,是编程语言中表示文本的数据类型。字符串是 Python 中最常用的数据类型。字符串的声明在 Python 中可以使用一对双引号"或者一对单引号'定义一个字符串。那么在开发时,是使用双引号还是使用单引号呢?首先呢,大多数编程语言都是用双引号来定义字符串,所以我们在开发时更倾向使用双引号,这样可以和其他编程语言相通。虽然可以使用\"或者\'做字符串的转义,但是在实际开发中:如果字符串内部需要使用双引号,那么可以使用单引号定义字符串。如果字符串内部需要使用单引号,可以使用双引号

2020-08-17 13:39:37 347

原创 详解Python字典数据类型

字典的定义dictionary(字典)是除列表以外 Python之中最灵活的数据类型。字典同样可以用来存储多个数据,通常用于存储描述一个物体的相关信息。和列表的区别:列表是有序的对象集合,字典是无序的对象集合。字典用大括号{}定义,以键值对的方式存储数据,键值对之间使用逗号,分隔,键和值之间使用冒号:分隔。注意点:键key是索引,值value是数据,键必须是唯一的,值可以取任何数据类型,但键只能使用字符串、数字或元组。以下是字典的示意图实例xiaoming = {"name": "小明",

2020-08-14 12:40:40 593 1

原创 Python中列表的兄弟篇——元组

元组的定义Tuple(元组)与列表类似,不同之处在于元组的元素不能修改。元组表示多个元素组成的序列,用小括号()来声明定义,用于存储一串信息,数据之间使用 , 分隔。元组的索引从0开始,索引就是数据在元组中的位置编号。元组也可以看做是不可变的列表,通常情况下,元组用于保存无需修改的内容。下面来声明一个元组info = ("zhangsan", 18, 1.75)元组中只包含一个元素时,需要在元素后面添加逗号。如果定义只有一个元素的元组后面不加逗号时,Python不会认为它是一个元组,而是按

2020-08-13 09:15:24 195 1

原创 Python中的迭代遍历 for in

遍历就是从头到尾依次从列表中获取数据,在循环体内部针对每一个元素,执行相同的操作。在Python中为了提高列表的遍历效率,专门提供的迭代(iteration)遍历。使用 for...in 就能够在 Python 中实现迭代遍历。在 Python 中,for 循环可以遍历任何序列的项目,如列表、元组、字典以及字符串。本文只用列表作简单举例,涉及到个别数据类型的特殊用法,我们后面再补充。for…in 循环流程图for基础用法语法格式:# for 循环内部使用的变量 in 列表for name

2020-08-11 12:56:06 914

原创 Python中的数组——列表

一、列表简介List(列表)是 Python 中最基本的数据结构,也是使用最频繁的数据类型,在其他语言中通常叫做数组。列表专门用于存储一串信息,用方括号 [ ] 定义数据,数据之间使用逗号,分隔。序列中的每个元素都分配一个数字,即是它的位置,或索引。第一个索引是0,第二个索引是1,依此类推。列表的数据项不需要具有相同的类型。下面来简单定义一个列表。name_list = ["zhangsan", "lisi", "wangwu", "zhaoliu"]二、列表常用操作序号分类

2020-08-10 13:32:12 871

原创 Python循环流程语句 while

说起循环,发一张图,不知道能不能勾起大家小时候的回忆。循环就是让指定的代码重复地执行。python 中的 while 语句用于循环执行程序,即在某条件下,循环执行某段程序,以处理需要重复处理的相同任务。当要求你在页面上打印5遍“Hello Python”,你可以写5行 print代码,但是如果要求打印100行,1000行呢,这时就要使用 while 语句了。一、while 语句基本语法while 判断条件(condition): 执行语句(statements)……执行语句可以是单个

2020-08-06 09:10:30 418

原创 Python条件判断语句 if

程序在一般情况下是按顺序执行的,就像流水账一样,一条一条从上往下顺序执行。有时候我们需要根据条件来有选择地执行某些语句,这就要使用到Python的条件判断语句——if。我们可以通过下图来简单了解条件语句的执行过程。一、if 语句基本形式语法格式:if 要判断的条件表达式: 条件成立时,要做的事情 ……“表达式”可以是一个单一的值或者变量,也可以是由运算符组成的复杂语句,形式不限,只要它能得到一个值就行。如果 if 条件成立,...

2020-08-05 10:33:26 498

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除