自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Ayhan_huang的博客

Die Nacht ist dunkel und voller Schrecken

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

原创 I/O多路复用

I/O多路复用(I/O multiplexing),单个进程,就可以实现并发处理多个网络连接。目前有三种实现方式:select(全平台)、poll(linux)、epoll(linux)。前两者的基本原理是,轮询其监听的所有socket,一旦有数据到达,就将目标soket取出,就通知用户处理。epoll的实现略有不同,它为每个socket绑定一个回调函数,一旦socket有数据到达,就会触发回调函数

2017-07-21 16:59:18 359

原创 协程

概念协程的yield实现greenlet模块gevent概念协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。 需要强调的是: 1. python的线程属于内核级别的,即由操作系统控制调度(如单线程一旦遇到io就被迫交出cpu执行权限,切换其他线程运行) 2. 单线程内开启协程,一

2017-07-20 19:06:25 1985

原创 进程池和线程池

我们知道多进程可以利用多核CPU进行并行计算,但多进程的资源开销很大,因此不可能无限开。举个栗子,假设有100块砖,是请5个人去搬,还是请100个人去搬?答案是5个人,100个人工钱太贵了。。。这就和开多进程是一样的道理。那如何限制进程数量呢?通过进程池。 Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池

2017-07-20 17:04:21 1000

原创 进程间的通信

由于Cpython中GIL的存在,想要做到真正的并行,充分利用多核CPU,那只能开多进程,进程数通常等于CPU的核心数,过多的进程也无法做到并行。进程的资源开销很大,当多进程数量很多时,OS忙着切换进程,就会出现硬盘狂闪,系统假死的情况。每个进程都是一个独立的内存空间,因此进程间的通信,并不像线程间的通信那么容易。下面介绍三种进程间通信的方式:对列,管道,共享数据。对列我们知道在多线程中,创建一个线

2017-07-20 16:24:10 376

原创 queue队列

概念队列也是一种数据结构,和列表有点像,但是内置了锁。队列用于多线程编程时线程间的通讯,能保证线程安全。创建import queue q = queue.Queue(maxsize) 括号内可以指定队列长度,默认是无限长度。 这样就创建了一个FIFO先进先出队列,它是单向的,左边放,右边取。方法 q.put(item, block=True, timeout=None) 往队列内放入元素it

2017-07-19 14:52:48 533

原创 互斥锁、死锁、递归锁、信号量、Event

互斥锁互斥锁也叫用户锁、同步锁。 在多进程/多线程程序中,当多个线程处理一个公共数据时,会有数据安全问题,唯一能保证数据安全的,就是通过加锁的方式,同一时间只能有一个修改数据的操作,将处理数据变为串行。虽然牺牲了速度,但是保证了数据安全。来看一个不加锁的栗子:import timedef sub(): global num temp = num time.sleep(0.0

2017-07-18 18:22:21 1759

原创 进程和线程

概念进程:程序运行的状态就是进程。进程包括三个部分:程序(一堆代码)、数据集(程序在执行过程中的所有数据的集合)、进程控制块PCB(寄存器保存状态,OS利用它来管理进程)线程:在现代操作系统中,进程相当于一个容器,线程是其中的执行单位。二者的关系: 3.1 一个线程只能属于一个进程,一个进程至少有一个线程。 3.2 进程都是最小的资源管理单元,线程是最小的执行单元:即操作系统分配资源给进程

2017-07-17 16:49:26 378

原创 Socket网络编程

C/S架构和SoketC/S架构即客户端/服务器架构,包括软件(web应用)和硬件(比如打印机)两种架构方式。客户端和服务端的通信基于网络协议,而Socket套接字将复杂的网络协议(TCP/IP、UDP/IP协议族)封装起来,提供一组简单的接口供使用者调用。因此基于Socket,我们能方便地开发符合网络协议标准的客户端和服务端软件。套接字家族AF_UNIX > 地址家族:U

2017-07-12 19:59:24 863

原创 面向对象内置方法

__str__对于python的数据类型(类型也是类),打印结果是一个值。 而对于自定义类并实例化的对象,打印这个对象,得到的结果是一个内存地址。而那有没有办法自定义对象的打印信息呢?在类体中定制 __str__ 函数即可实现这个功能。class Teacher: def __init__(self,name,major,level): self.name = name

2017-07-07 16:16:24 438

原创 反射

点方法访问属性的本质: obj.arrt >>> obj.__dict__[‘attr’] 本质是到对象的名称空间,通过属性的字符串名字来找。通过字符串操作属性,就是反射。 python提供了通过字符串操作对象属性的方法(tips: python中一切皆对象): 1. hasattr(obj, ‘attr’) 判断属性,返回True/False 2. getattr(obj, ‘attr’

2017-07-07 12:46:21 220

原创 绑定方法与非绑定方法

绑定方法绑定到对象的方法定义:凡是在类中定义的函数(没有被任何装饰器修饰),都是绑定给对象的,就是给对象用的。 特点:obj.method() 自动把obj作第一个参数传入,因为method的逻辑就是要处理这个obj tips: 对象的绑定方法,类也可以调用,但是必须把对象传入作为第一个参数。绑定到类的方法定义:凡是在类中定义的,被@classmethod装饰的函数,就是绑定到类的方法。 特点

2017-07-06 13:21:29 583

原创 多态

多态就是同一类事物的多种形态。python对传入参数的数据类型没有限制,因此,只要是同一类的(比如序列),都可以用一些方法。比如序列:字符串、列表、元组 都有一些方法:obj.__len__、 切片。那么对于字符串 s, 列表 l,元组 t,都可以通过len(s)、len(l)、len(t) 来获取长度。上面是内置函数的,下面的栗子我们来自定义一类事物及其多种形态:import abcclass

2017-07-06 13:00:10 221

原创 封装

封装封装有两个层面:封装数据、封装功能。 在python中没有常量一样,只是将变量名用大写的方式来提醒你,但仍然可以修改。封装数据就是将数据隐藏起来,通过在名称前加双下划线:__attr 但是并没有真正的隐藏,只是做了一次变形,让你无法通过原来的名字访问到:__attr >>> _ClassName__attr, 通过后者,你仍然可以访问到。 有两点要注意: 1. 这种变形操作只发生在类的定义

2017-07-05 16:07:15 522

原创 继承、派生、组合

继承类之间会有一些相同的属性,提取这些相同的属性做成基类(父类) 继承是创建类的一种方式,通过代码重用,减少代码冗余。把父类的属性遗传给子类。 在创建类时,新建的类可以继承一个或多个父类,方式如下:class ClassName(BaseName1, BaseName2,...): # 括号内是继承的父类 '类注释文档' pass继承是一种类与类之间的关系: 什么 是 什么 。

2017-07-03 16:26:23 408

空空如也

空空如也

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

TA关注的人

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