03 2019 档案

摘要:一 了解select,poll,epoll 二 selectors模块 这三种IO多路复用模型在不同的平台有着不同的支持,而epoll在windows下就不支持,好在我们有selectors模块,帮我们默认选择当前平台下最合适的 基于selectors模块实现并发的FTP 阅读全文
posted @ 2019-03-19 17:06 以后、 阅读(350) 评论(0) 推荐(0)
摘要:IO模型比较分析 到目前为止,已经将四个IO Model都介绍完了。现在回过头来回答最初的那几个问题:blocking和non-blocking的区别在哪,synchronous IO和asynchronous IO的区别在哪。先回答最简单的这个:blocking vs non-blocking。前 阅读全文
posted @ 2019-03-19 17:04 以后、 阅读(220) 评论(0) 推荐(0)
摘要:异步IO(Asynchronous I/O) Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入。先看一下它的流程: 用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先 阅读全文
posted @ 2019-03-19 17:02 以后、 阅读(142) 评论(0) 推荐(0)
摘要:多路复用IO(IO multiplexing) IO multiplexing这个词可能有点陌生,但是如果我说select/epoll,大概就都能明白了。有些地方也称这种IO方式为事件驱动IO (event driven IO)。我们都知道,select/epoll的好处就在于单个process就可 阅读全文
posted @ 2019-03-19 17:00 以后、 阅读(168) 评论(0) 推荐(0)
摘要:非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking。当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会bloc 阅读全文
posted @ 2019-03-19 16:58 以后、 阅读(86) 评论(0) 推荐(0)
摘要:阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还 阅读全文
posted @ 2019-03-19 16:56 以后、 阅读(120) 评论(0) 推荐(0)
摘要:IO模型介绍 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-bloc 阅读全文
posted @ 2019-03-19 16:53 以后、 阅读(73) 评论(0) 推荐(0)
摘要:一 gevent模块 Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。 上例gevent.s 阅读全文
posted @ 2019-03-19 16:50 以后、 阅读(292) 评论(0) 推荐(0)
摘要:一 greenlet模块 如果我们在单个线程内有20个任务,要想实现在多个任务之间切换,使用yield生成器的方式过于麻烦(需要先得到初始化一次的生成器,然后再调用send。。。非常麻烦),而使用greenlet模块可以非常简单地实现这20个任务直接的切换 单纯的切换(在没有io的情况下或者没有重复 阅读全文
posted @ 2019-03-19 16:46 以后、 阅读(130) 评论(0) 推荐(0)
摘要:一 引子 1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 单纯地切换反而会降低运行效率 二:第一种情况的切换。在任务一遇到io情况下,切到任务二去 阅读全文
posted @ 2019-03-19 16:43 以后、 阅读(381) 评论(3) 推荐(0)
摘要:一 进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪,于是我们必须对服务端开启的进程数或线程数加以控制, 阅读全文
posted @ 2019-03-19 15:17 以后、 阅读(88) 评论(0) 推荐(0)
摘要:一 线程queue queue is especially useful in threaded programming when information must be exchanged safely between multiple threads. 有三种不同的用法 class queue. 阅读全文
posted @ 2019-03-19 15:13 以后、 阅读(573) 评论(0) 推荐(0)
摘要:一 信号量 信号量也是一把锁,可以指定信号量为5,对比互斥锁同一时间只能有一个任务抢到锁去执行,信号量同一时间可以有5个任务拿到锁去执行,如果说互斥锁是合租房屋的人去抢一个厕所,那么信号量就相当于一群路人争抢公共厕所,公共厕所有多个坑位,这意味着同一时间可以有多个人上公共厕所,但公共厕所容纳的人数是 阅读全文
posted @ 2019-03-19 15:10 以后、 阅读(180) 评论(0) 推荐(0)
摘要:一 死锁现象 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 执行效果 二 递归锁 解决方法,递归锁,在Python中为了支持 阅读全文
posted @ 2019-03-19 15:07 以后、 阅读(333) 评论(0) 推荐(0)
摘要:一 印子 首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。>有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样 阅读全文
posted @ 2019-03-19 15:02 以后、 阅读(172) 评论(0) 推荐(0)
摘要:一 守护线程 无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁 需要强调的是:运行完毕并非终止运行 详细解释: 验证 执行结果 阅读全文
posted @ 2019-03-16 15:05 以后、 阅读(1086) 评论(0) 推荐(0)
摘要:Thread对象的其他属性或方法 介绍 验证 执行结果 主线程等待子线程结束 执行结果 阅读全文
posted @ 2019-03-16 15:02 以后、 阅读(251) 评论(0) 推荐(0)
摘要:一 谁的开启速度快? 1、在主进程下开启线程 执行结果如下,几乎是t.start ()的同时就将线程开启了,然后先打印出了hello,证明线程的创建开销极小 2、在主进程下开启子进程 执行结果如下,p.start ()将开启进程的信号发给操作系统后,操作系统要申请内存空间,让好拷贝父进程地址空间到子 阅读全文
posted @ 2019-03-16 14:57 以后、 阅读(122) 评论(0) 推荐(0)
摘要:一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 二 开启线程的两种方式 方式一 方式二 阅读全文
posted @ 2019-03-16 14:52 以后、 阅读(601) 评论(0) 推荐(0)
摘要:一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于cpu),而一条流水线必须属于一个车间,一个车间的工作过程是一个进程,车间负责把资源整合到一起,是一个资源单位,而一个车间内至少有一条流水线。 阅读全文
posted @ 2019-03-15 16:18 以后、 阅读(111) 评论(0) 推荐(0)
摘要:一 生产者消费者模型介绍 为什么要使用生产者消费者模型 生产者指的是生产数据的任务,消费者指的是处理数据的任务,在并发编程中,如果生产者处理速度很快,而消费者处理速度很慢,那么生产者就必须等待消费者处理完,才能继续生产数据。同样的道理,如果消费者的处理能力大于生产者,那么消费者就必须等待生产者。为了 阅读全文
posted @ 2019-03-15 16:13 以后、 阅读(309) 评论(0) 推荐(0)
摘要:队列介绍 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类(底层就是以管道和锁定的方式实现): 参数介绍: 队列的使用 阅读全文
posted @ 2019-03-15 16:05 以后、 阅读(556) 评论(0) 推荐(0)
摘要:一 互斥锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如下 如何控制,就是加锁处理。而互斥锁的意思就是互相排斥,如果把多个进程比喻为多个人,互斥锁的工作原理就是多个人都要去争抢同一个资源:卫生间,一个人 阅读全文
posted @ 2019-03-15 15:59 以后、 阅读(2672) 评论(1) 推荐(0)
摘要:守护进程 主进程创建子进程,然后将该进程设置成守护自己的进程,守护进程就好比崇祯皇帝身边的老太监,崇祯皇帝已死老太监就跟着殉葬了。 关于守护进程需要强调两点: 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemoni 阅读全文
posted @ 2019-03-15 13:55 以后、 阅读(502) 评论(0) 推荐(0)
摘要:一 Process对象的join方法 在主进程运行过程中如果想并发地执行其他的任务,我们可以开启子进程,此时主进程的任务与子进程的任务分两种情况 情况一:在主进程的任务与子进程的任务彼此独立的情况下,主进程的任务先执行完毕后,主进程还需要等待子进程执行完毕,然后统一回收资源。 情况二:如果主进程的任 阅读全文
posted @ 2019-03-15 13:49 以后、 阅读(1805) 评论(0) 推荐(1)
摘要:一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu\_count\(\)查看),在python中大部分情况需要使用多进程。 Python提供了multiprocessing。 multiprocessing模块用来开启 阅读全文
posted @ 2019-03-14 15:01 以后、 阅读(777) 评论(0) 推荐(0)