文章分类 - 4.网络编程基础
摘要:之前我们就讲了select的这种方式,使用的是轮询方式去监测客户端的连接,效率比较低下,我们今天来聊聊epoll的方式,这种效率更高,但是这种方式在Windows下不支持,在Linux是支持的,那就不得不说下面的一个模块selectors。 2.1、英文解释 This module allows h
阅读全文
摘要:之前我们讲了select、poll、epoll的介绍,我们今天先来说说select的IO多路复用代码实现。我们先来根据之前图说说select的原理。 Python的select()方法直接调用操作系统的IO接口,它监控sockets,open files, and pipes(所有带fileno()
阅读全文
摘要:select 负责监控和检测很多个socket连接,与下面这个内核态到用户态没什么关系,它只是说监控连接有一个连接,然后其中100个连接0k了,它就会返回。 说明:IO多路复用中包括 select、pool、epoll,这些都属于同步,还不属于异步。 2.1、select select最早于1983
阅读全文
摘要:刚才说了,对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,它会经历两个阶段:1. 等待数据准备 (Waiting for the data to be ready)2. 将数据从内核
阅读全文
摘要:1、我们之前讲了IO操作什么时候切换回来呢? 我们刚刚讲了回调函数,这个回调函数是当你的程序一遇到IO操作,再一切换,这个切换的时候,切换之前你等着IO操作完了再回来。 2、IO 为什么不阻塞呐? 因为IO操作是用操作系统完成的,咋们用户读一个文件,你以为自己的程序打开一个文件,然后去把文件的内容读
阅读全文
摘要:通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求; (2)每收到一个请求,创建一个新的线程,来处理该请求; (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求 上面的几种方式,各有千秋, 第(1)中方法,由于创建新
阅读全文
摘要:刚刚只是在理论上讲述了gevent遇到io自动切换,下面我们就来实际操作一下,在实战过程中我们用协程大面积的爬虫,看看如何用gevent去实现并发的效果的。 2.1、串行爬网页 说明:我们先来看看串行效果的爬网页的代码,看看消耗多长时间 执行结果如下: 2.2、gevent协程爬虫 说明:刚刚是串行
阅读全文
摘要:感觉确实用着比generator还简单了呢,但好像还没有解决一个问题,就是遇到IO操作,自动切换,对不对?所以我们接下来就说说如何遇到IO就切换,不得不提到一个模块Gevent。 Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Green
阅读全文
摘要:协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合
阅读全文
摘要:本篇博客主要写进程锁,__name__ == "__main__"函数作用,以及进程池的使用。 2.1、进程锁 说明:通过multiprocessing中的Lock模块来实现进程锁。 1、这边不禁的有个疑问,就是进程中不是相互独立的吗?为啥还要加锁呐? 虽然每个进程都是独立运行的,但是问题来了,它们
阅读全文
摘要:之前我们讲述了进程之间的是通过进程中的Queue,来进行数据共享的,其实还有一种方式实现数据共享,那就是管道,pipe,以及数据共享manger。 2.1、Pipe()函数 英文解释:The Pipe() function returns a pair of connection objects c
阅读全文
摘要:我们知道不同进程之间内存是不共享的,要想实现两个进程间的通信,咋办呢?我们用什么知识来解决呐?今天就来说说进程间的通信。 之前我们说了queue,这个是线程queue,它的主要目的是两个线程之间的数据,一个是生产者,一个是消费者的模型,而且你必须是线程。只能在这个主线程内的其他线程访问,出了这个进程
阅读全文
摘要:之前我们了解的线程,接下来我们学习多进程,进程之间是相互独立的,python是启动进程的时候,是启动的是原生进程。进程是没有GIL锁的,而且不存在锁的概念,进程之间的数据式不能共享的,而线程是可以的。 英文解释如下: multiprocessing is a package that support
阅读全文
摘要:queue is especially useful in threaded programming when information must be exchanged safely between multiple threads.(在多个线程之间安全的交换数据信息,队列在多线程编程中特别有用。
阅读全文
摘要:我们日常生活中经常遇到红绿灯,我们就很好理解红绿灯的例子,就是红灯停,绿灯行。 我现在生成一个线程,这个线程我让它扮演红绿灯,它每过一段时间就变成绿灯,又过一段时间变成红灯,又变成黄灯。然后我再生成3-5个线程作为车。车看见红灯,它就停下来等着,如果说是绿灯,车子就走。所以就涉及到红灯这个线程,红绿
阅读全文
摘要:互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去。 信号量:就是在同一时间,可以只允许设定的数执行,所以设置了信号量,就有多把锁。 说明:这个好比有3个人上厕所,就只有3把锁
阅读全文
摘要:我们今天来聊聊递归锁,到底什么是递归锁,为什么会存在? 2.1、前戏 说明:比如你进学校去班级,结果进学校的时候有一道门,进班级的时候又有一道门,你首先进入学校要把第一道门打开,然后锁上。进入学校之后,你又要进班级的门,然后锁上。然后你出班级,就是要打开第二把锁,然后再出校门打开第一把锁。但是这边有
阅读全文
摘要:线程需要沟通,需要共享数据,但是我们之前并没有涉及到多线程情况共享数据的例子。下面我们就来探讨一下,多线程共享数据会出现什么情况。这边就需要用到线程锁,又叫互斥锁(mutex)。 2.1、前戏 说明:我们现在来探讨多线程数据共享的情况 这个时候有些小伙伴就说了,你最后输出的结果怎么会是 97 呢?应
阅读全文
摘要:一、前言 我的机器有4核,代表着同一时间,可以干4个任务。如果单核cpu的话,我启动10个线程,我看上去也是并发的,因为是执行了上下文的切换,让我看上去是并发的。但是单核永远肯定时串行的,它肯定是串行的,cpu真正执行的时候,因为一会执行1,一会执行2.。。。。正常的线程就是这个样子的。 但是,在p
阅读全文
摘要:一、前言 我们说在不加join的时候,主线程和子线程完全是并行的,没有了依赖关系,你主线程执行了,我子线程也执行了。但是加了join之后,主线程依赖子线程执行完毕才往下走。现在我们要把所有的子线程编成我的守护进程。 守护进程:说白了,你是主人,你搞了几个仆人,这些个仆人都是为你服务的。可以帮你做很多
阅读全文