![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Python进阶
橘九。
进击的小白
展开
-
62.Python进阶__进程,线程,协程对比
线程,进程,协程简单对比:进程是资源分配的单位;线程是操作系统调度的单位;进程切换需要的资源很大,效率很低;线程切换需要的资源一般,效率一般(当然在不考虑GIL的情况下)协程切换任务资源很小,效率高;多进程,多线程根据CPU核数不一样可能是并行的,但是协程是在一个线程中,所以是并发;Python中的线程由于GIL锁的存在,并不能实现并行;线程: from threading...原创 2019-09-21 15:04:09 · 94 阅读 · 0 评论 -
61.Python进阶_进程池02_进程池间通信
进程池之间的通信需要使用multiprocessing模块中的Manager.Queue()而不是multiprocessing模块中的Queue()否则会报错;同样需要将进程以参数的形式传入:直接看代码了解执行过程:from multiprocessing import Pool,Managerimport timeimport osdef reader(q1): ...原创 2019-09-21 11:42:42 · 112 阅读 · 0 评论 -
60.Python进阶_进程池01
当需要创建的子进程不多时,我们可以利用multiprocessing中的Process动态生成多个进程,但是如果是上百甚至是上千个目标,手动去创建进程的工作量巨大,此时可以使用multiprocessing模块提供的Pool方法;初始化Pool时,可以指定一个最大进程数,212=...原创 2019-09-21 11:05:08 · 93 阅读 · 0 评论 -
59.Python进阶_协程04_money补丁
money.patch_all()打补丁作用:只要在耗时的地方(大部分)自动切换任务,不受限与gevent.sleep()看下案例:from gevent import monkeyimport timemonkey.patch_all() #打补丁def work1(): for i in range(5): print('---子协程work1执行...原创 2019-09-19 22:30:22 · 212 阅读 · 0 评论 -
58.Python进阶_协程03_gevent
greenlet已经实现了协程,但是还是人工切换,有点麻烦,这节看一下自动切换的模块gevent原理是当一个greenlet遇到IO(指的是Input,output输入输出,比如网络,文件操作等)操作时,比如访问网络,就自动切换到greenlet,等到IO操作完成,再适当时候切换回来继续执行,由于IO非常耗时,经常让程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet...原创 2019-09-19 21:55:28 · 107 阅读 · 0 评论 -
57.Python进阶_协程02_greenlet
之前都是手动切换有规律,为了更好的使用协程来完成多任务,Python中greelet模块对其进行封装,从而让切换任务更加简单;安装:pip3 install greelet直接看一下greelet的使用g1 = greenlet(fun) #开启协程g1.switch() #切换的开关注意:需要从greenlet模块中导入greenlet类,名字相同from gre...原创 2019-09-18 23:12:45 · 97 阅读 · 0 评论 -
56.Python进阶_协程01_理解实现原理
什么是协程:协程又称为微线程,是Python另外一种实现多任务的方式,只是比线程更小占用更小的执行单元(理解为需要的资源),为啥是一个执行单元,因为自带CPU上下文;通俗的理解:在一个线程中的某个函数,可以在任何地方保存当前函数的一些临时变量信息,然后切换到另外一个函数中运行,注意不是通过调用函数的方式实现,并且切换的次数和何时切换到原本函数都是开发者自己决定;协程和线程的差异:在实...原创 2019-09-18 22:48:53 · 178 阅读 · 0 评论 -
55.Python进阶_进程05_进程间通信
进程间资源不共享,但是需要操作相同的资源,这个时候需要进程间通信会使用到队列;multiprocessing.Quene()和queue.Queue()区别:Queue.Queue是进程间通信;用于一个进程中,每个线程之间进行通讯;multiprocess.Queue是跨进程通信队列注意:使用时候要通过参数进行传递到各个进程任务之中;看一下代码:from multiproce...原创 2019-09-18 22:18:38 · 86 阅读 · 1 评论 -
54.Python进阶_进程04_进程操作共同资源
进程间的资源是不会共享的from multiprocessing import Processimport osnumber = 0def work1(*args): global number for i in range(5): number += 1 print(F'子进程1{args}执行任务pid={os.getpid()}--...原创 2019-09-17 23:51:33 · 110 阅读 · 0 评论 -
53.Python进阶_进程03_常用方法
multiprocessing常用方法:target:如果传递了函数的引用;args:给target指定的函数传递的参数,已元组的方式传递;kwargs:给target指定的命名参数;name:给进程设定名字Process创建的实例对象常用方法:start():启动子进程实例is_alive():判断子进程对象是否还激活;join():等待子进程terminate():不管...原创 2019-09-17 23:03:14 · 96 阅读 · 0 评论 -
53.Python进阶_进程02_进程类
上一节我们使用multiprocessing创建了进程,这一节看一下使用进程类的方式进程创建进程;需要继承Process类from multiprocessing import Processclass MyProcess(Process): def run(self): with open('test.txt','a',encoding='utf8') as f...原创 2019-09-17 22:38:24 · 73 阅读 · 0 评论 -
52.Python进阶_进程01
进程介绍:程序:例如QQ,微信都是程序;进程:一个程序运行起来后,代码+用到的资源称为进程,它是操作系统分配资源的基本单元;不仅可以通过线程完成多任务,进程也是可以的;进程的状态:工作中,任务数往往大于cpu核数,即一定有一些任务正在执行,另外一些任务等待执行,因此导致有不同的状态;就绪状态:运行的条件已经满足了,正在等待cpu运行执行状态:cpu正在执行其功能;等待状态:等...原创 2019-09-17 22:22:49 · 156 阅读 · 0 评论 -
51.Python进阶_队列03_先进后出队列和优先级队列
LIFO队列 (先进后出)LifoQueue(maxsize=0) LIFO即Last in First Out,后进先出。与栈的类似,使用和先进先出队列相同,只是取出数据的顺序不同,from queue import Queue,LifoQueue,PriorityQueueq = LifoQueue(5) #创建队列对象for i in range(5): q.put(...原创 2019-09-16 23:07:32 · 515 阅读 · 0 评论 -
50.Python进阶_队列02_改进多线程资源竞争
之前我们在多线程那一节中看了一个由于存在全局变量资源竞争造成的100万bug,这节我们看一下如何使用队列来改进此Bug,from threading import Thread,Lockfrom queue import Queuenumber = 0q = Queue(2)q.put(number)def work1(): global number for i in...原创 2019-09-16 22:50:09 · 179 阅读 · 0 评论 -
49.Python进阶_队列01_先进先出队列
Python的Quene模块中提供了同步的,线程安全的队列类,包括 -FIFO(先进先出)队列Queue,LIFO(先进后出)队列LifoQueue,优先级队列PriorityQueue这些队列都实现了锁原语,能够在多线程中直接使用,可以使用列表来实现线程间同步;初始化Queue()对象时,如果(q=Queue(),若括号中没有指定最大可接受的消息数量,或者数量为负值,那么代表可接受...原创 2019-09-16 22:39:46 · 1916 阅读 · 0 评论 -
13.Python基础11_集合Set
集合(set)是一个无序的不重复元素序列。可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。创建格式:parame = {value01,value02,...}或者set(value)basket = {'apple', 'orange', 'apple', 'pear', 'oran...原创 2019-09-16 18:57:25 · 1063 阅读 · 0 评论 -
48.Python进阶_线程4_GIL全局解释器锁
python单线程和多线程分别用于完成什么工作?IO密集型:涉及到网络,磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务大部分是等待IO操作完成(因为IO的速度远低于CPU和内存的)...原创 2019-09-11 18:05:13 · 97 阅读 · 0 评论 -
47.Python进阶_线程3_资源竞争
来看一个线程数很多且存在资源共享的例子:from threading import Threadnumber = 1def work1(): global number for i in range(100): number =+ 1def work2(): global number for i in range(100): ...原创 2019-09-11 18:04:57 · 164 阅读 · 0 评论 -
46.Python进阶_线程2_带参数的线程
有参数时:带参数的类线程组:需要定义:init初始化方法,并在初始化方法中继承父类初始化方法 super().__init__()看一下带有参数的类线程组如何执行:import timefrom threading import Threadimport requestsdef warpper(func): def count_time(): start_...原创 2019-09-10 23:57:57 · 305 阅读 · 0 评论 -
45.Python进阶_线程1
threading模块介绍:创建线程对象:threading.Thread(target=func)参数target指定线程执行的任务(函数),注意是函数名;zM0NDAwNzQ1,size_16,color_FFFFFF,t_70)Thread 类提供了以下方法:start() : 启动线程活动join(time) :设置主线程会等待time秒后再往下执行,time默认子线...原创 2019-09-10 23:50:40 · 91 阅读 · 0 评论 -
44.Python进阶_并发和并行
并发和并行:CPU和多任务的关系:单核CPU可以执行多任务吗?也可以执行多任务,由于CPU执行代码都是按照顺序执行,那么单核CPU如何执行多任务?就是让操作系统轮流让每个任务交替执行。运行速度很快情况下,就感觉是同时执行;真正的并行执行只能在多核cpu上实现。但是任务远远多于CPU内核数量,所以操作系统也会自动把多任务轮流执行执行;并发和并行:并发:指的是任务数多于cpu内核数,通过...原创 2019-09-10 22:16:17 · 113 阅读 · 0 评论 -
43.Python进阶_垃圾回收机制
引用计数机制为主,标记-清除和分代收集两种机制为辅的策略;垃圾回收英文是 Garbage collection(GC), 当有人说GC的时候就要想到是垃圾回收。垃圾回收机制主要的任务有以下:分配内存对象引用计数, 并识别没有引用的对象进行清除没有引用的对象引用计数:每个对象创建之后都有一个引用计数,当引用计数为0时候,那么此时的垃圾回收机制就会把它销毁,回收内存空间;引用增加:...原创 2019-09-06 15:34:12 · 185 阅读 · 0 评论 -
42.Python进阶_内存管理02_整数池和intern机制
1.小整数对象池看一个代码:In [1]: a=10In [2]: b=10In [3]: a is bOut[3]: True由于整数应该会用到,python为了优化速度,使用了小整数池,避免为整数频繁申请和销毁内存空间;小整数定义范围:[-5,257],这些整数是提前建立好的,不会被垃圾回收,Python中,所有位于这个范围内的整数使用的相同对象;同理:单个字母也是一样...原创 2019-09-06 10:21:28 · 210 阅读 · 0 评论 -
41. Python进阶_内存管理01_引用对象
首先我们来看一个赋值语句,a = 1010是一个数值类型的对象,那么a呢?a是一个对10这个对象引用的变量,再定义:b = a此时打印b返回的也是10这个对象,b也是对10这个变量的引用;但是这个...原创 2019-09-06 08:22:20 · 107 阅读 · 0 评论 -
40.Python进阶_元类
所有类的类型都是type,所有类都是通过type创建出来的,我们看一下下面的代码:#Python2中的方式成为旧式类 ,instanceclass MyClass: pass#Python3中两种定义方式没有任何区别都是object#python3中的这个方式成为新式类,typeclass MyClass1(object): passc= MyClass()c1=...原创 2019-09-04 23:22:20 · 90 阅读 · 0 评论 -
39.Python进阶_魔法方法___getattribute__和__getattr__
使用___getattribute__获取不存在的属性会报异常,而 __getattr__会捕获异常class Hero(): def __init__(self,name): self.name = name def __setattr__(self, key, value): '''给设置属性时,会调用此方法''' if...原创 2019-09-04 19:08:56 · 168 阅读 · 0 评论 -
38.Python进阶_魔法方法_自定义属性__setattr__和__delattr__
setattr(对象名,属性名,属性值) 设置属性getattr(对象名,属性名) 获取属性delattr(对象名,属性名) 删除属性先看一个设置属性的情况;class Hero(): def __init__(self,name): self.name = nameh = Hero('静静')h.age = 18setattr(...原创 2019-09-04 18:30:21 · 259 阅读 · 0 评论 -
37.Python进阶_内置属性__solts__
作用:属性限制,节省空间内存,提升性能;默认情况下,类的实例中有一个字典用于存储属性,这对于具有很少实例变量的对象会很浪费空间,当创建大量实例时,会消耗很多空间;可以通过在类中定义__slots__来覆盖默认__dict__行为,内置属性__solts__声明接收一个实例变量序列,并且在每个实例中只保存足够保存每个变量值的空间,因为没有为每个实例创建__dict__,所以节省空间;看一下正...原创 2019-09-03 22:30:40 · 145 阅读 · 0 评论 -
36.Python进阶_魔法属性__doc__
__doc__用来输出注释,访问模块,类声明或者函数的声明中第一个未被赋值的字符串.可以输出类,函数,对象,模块的注释;import randomclass MyClass(): ''' MyClass 类文档注释 ''' attr = 1 _attr1 = 2 __attr2 = 3 def func(self,name): ...原创 2019-09-03 22:11:33 · 155 阅读 · 0 评论 -
35.Python进阶_魔法属性__dict__
类调用__dict__属性,返回类属性和方法字典;对象调用__dict__属性,返回实例相关属性和方法的字典;class Hero(): attr = 1 _attr1 = 2 def __init__(self,name,age): self.name = name self.age = ageprint(Hero.__dict...原创 2019-09-03 18:49:19 · 293 阅读 · 0 评论 -
34.Python进阶_类的私有属性
类里面定义的属性叫类属性,那么类属性有两种,分为:共有属性和私有属性:Python并没有真正的私有化支持,但可用下划线得到伪私有私有属性定义:单下滑线开头:_attr protected双下划线开头:__attr private单下滑线私有属性:外部可以直接访问;表示的是protected(受保护的) 类型的变量,只能靠允许其本身与子类进行访问。,如:当使用“f...原创 2019-09-03 18:36:27 · 149 阅读 · 0 评论 -
33.Python进阶_魔法方法__add__和__sub__
定义加号的操作,即当使用+操作时,将会触发__add__()方法我们先看实例对象相加的情况:class MyStr(): def __init__(self,value): self.value = value def __str__(self): return self.values1=MyStr('aaa')s2=MyStr('BBBB...原创 2019-09-02 17:37:52 · 3264 阅读 · 0 评论 -
32.Python进阶_魔法方法__str__和__repr__方法
当我们使用print()这个内置函数之后,给他传入一个对象,那么这个时候实际触发对象的__str__,将该方法的返回内容直接输出到控制台;在交互环境中,输入对象,返回__repr__方法中返回的对象;使用场景:很多时候我们编写了一个类,在将它的实例在终端上打印或查看的时候,我们往往会看到一个不太满意的结果。>>> class Car:... def __init...原创 2019-09-01 22:38:23 · 237 阅读 · 0 评论 -
31.Python进阶_上下文管理器__enter__和__exit__
with 语句是 Pyhton 提供的一种简化语法,适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,with 语句主要是为了简化代码操作。with:文件使用后自动关闭# 创建一个文件test.txt,若存在则打开,写入Hello Python# 创建/打开文件f = open('test.txt', 'w')f.write("Hello P...原创 2019-08-31 17:26:49 · 221 阅读 · 0 评论 -
30.Python进阶_使用装饰器实现单例模式
上一节使用new方法实现了单例模式,其实还可以使用装饰器来实现单例模式:1.使用函数装饰器实现单例模式:#单例模式instance = Nonedef single(func): def single_in(): global instance if not instance: instance=object.__new__(...原创 2019-08-30 17:26:28 · 176 阅读 · 0 评论 -
29.Python进阶_使用New方法实现单例模式
单例设计模式1.设计模式:设计模式 是 前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对 某一特定问题 的成熟的解决方案使用 设计模式 是为了可重用代码、让代码更容易被他人理解、保证代码可靠性2. 单例设计模式:目的 —— 让 类 创建的对象,在系统中 只有 唯一的一个实例每一次执行 类名() 返回的对象,内存地址是相同的-也就是每一次创建的对象都指向第一次创建的对...原创 2019-08-30 12:01:37 · 408 阅读 · 0 评论 -
28.Python进阶_魔法方法_init和new方法
现在来看一下魔法函数中比较重要的两个内置属性_new__和__init__魔法函数区别:new的功能是在生成对象之前所做的动作.init是在对象生成之后完善对象的属性先来看一下Init的情况:class User: def __init__(self,name): self.name=name print("---init...原创 2019-08-30 11:07:58 · 325 阅读 · 0 评论 -
26.Python进阶_装饰器装饰类08
之前我们看的是函数作为装饰器,类可以作为装饰器,被装饰的对象之前学习的都是函数,今天我们来看一下装饰器装饰类;def test(func): def test_in(): print("----test_in-----") func() return test_in@test #Hero=test(Hero)class Hero(ob...原创 2019-08-30 10:37:08 · 86 阅读 · 0 评论 -
25.Python进阶_带参数的装饰器07
装饰器也可以带有参数:def test_org(arg): #最外层再嵌套一个函数 def test(fun): def test_in(*args, **kwargs): print("log 日志为---%s----- "%arg) a = fun(*args, **kwargs) retu...原创 2019-08-28 16:47:04 · 108 阅读 · 0 评论 -
24.Python进阶_通用装饰器写法06
通用装饰器要求 :1.被装饰函数 支持 不管有没有返回值都需要支持,2. 被装饰函数支持 ,不管有多少参数 ,装饰器都要支持结合之前的学习的带参数的和带返回值的可以写出以下形式的装饰器:def test(func): def test_in(*args, **kwargs): print("log 日志为------------ ") a = fu...原创 2019-08-28 16:36:17 · 156 阅读 · 0 评论