随笔分类 -  python 并发编程

摘要:1、思考开启进程的方式一和方式二各开启了几个进程? 2个进程,一个主进程,一个字进程 2、进程之间的内存空间是共享的还是隔离的?下述代码的执行结果是什么? 隔离的, 主进程内,打印n是100 子进程内,打印n是0 from multiprocessing import Process n=100 d 阅读全文
posted @ 2020-03-13 22:45 minger_lcm 阅读(482) 评论(0) 推荐(0) 编辑
摘要:多路复用IO(IO multiplexing) 这种IO方式为事件驱动IO(event driven IO)。 我们都知道,select/epoll的好处就在于单个进程process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有 阅读全文
posted @ 2019-08-01 21:36 minger_lcm 阅读(189) 评论(0) 推荐(0) 编辑
摘要:异步IO(Asynchronous I/O) Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入。先看一下它的流程: 用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先 阅读全文
posted @ 2019-08-01 21:36 minger_lcm 阅读(300) 评论(0) 推荐(0) 编辑
摘要:非阻塞IO(non-blocking IO) Linux下,可以通过设置socket使其变为non-blocking。当对一个non-blocking socket执行读操作时,流程是这个样子: 从图中可以看出,当用户进程发出read操作时,如果kernel中的数据还没有准备好,那么它并不会bloc 阅读全文
posted @ 2019-08-01 21:36 minger_lcm 阅读(895) 评论(0) 推荐(0) 编辑
摘要:阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样: 当用户进程调用了recvfrom这个系统调用,kernel内核就开始了IO的第一个阶段:准备数据。对于network io( 网络io )来说,很多时候数据在一开始 阅读全文
posted @ 2019-07-27 23:55 minger_lcm 阅读(306) 评论(0) 推荐(0) 编辑
摘要:基于协程池 实现并发的套接字通信 客户端: 服务端: 阅读全文
posted @ 2019-07-27 21:55 minger_lcm 阅读(391) 评论(0) 推荐(0) 编辑
摘要:之前线程池是通过操作系统切换线程,现在是程序自己控制,比操作系统切换效率要高 服务端 客户端给服务端发送500个并发量,会看到一直不停的收消息 阅读全文
posted @ 2019-07-27 18:10 minger_lcm 阅读(181) 评论(0) 推荐(0) 编辑
摘要:python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并发编程 多路复用IO模型 python 并发编程 异步IO模型 阅读全文
posted @ 2019-07-27 15:35 minger_lcm 阅读(146) 评论(0) 推荐(0) 编辑
摘要:阻塞io行为 server.accept server.recv client.send recv,accept 分为两个阶段 1.wait for data 对方把数据经过网络延迟送到自己的操作系统缓存 2.把数据从操作系统缓存拷贝到应用程序内存 本地拷贝很快的,比等待要快 send只有一个阶段 阅读全文
posted @ 2019-07-27 15:03 minger_lcm 阅读(380) 评论(0) 推荐(0) 编辑
摘要:gevent 底层是怎么实现? io模型4个重要概念: 两类 一类:同步、异步 提交任务的方式 同步: 提交完任务后,在原地等待结果,拿到结果后,才执行下一行代码 异步: 提交完任务就不管了,往下执行 异步通常和回调机制联用,提交完任务,任务运行完后,自动触发,回调函数代码 阻塞:遇到io,阻塞卡主 阅读全文
posted @ 2019-07-27 14:58 minger_lcm 阅读(192) 评论(0) 推荐(0) 编辑
摘要:协程池 阅读全文
posted @ 2019-07-27 13:46 minger_lcm 阅读(1259) 评论(0) 推荐(0) 编辑
摘要:一 gevent模块 gevent应用场景: 单线程下,多个任务,io密集型程序 安装 Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程 阅读全文
posted @ 2019-07-12 23:19 minger_lcm 阅读(1265) 评论(0) 推荐(0) 编辑
摘要:python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 python 并发编程 协程 gevent模块 python 并发编程 基于gevent模块实现并发的套接字通信 python 并发编程 协程池 python 并发编程 基于gevent模块 协程池 实现并发 阅读全文
posted @ 2019-07-11 23:07 minger_lcm 阅读(154) 评论(0) 推荐(0) 编辑
摘要:一 greenlet模块 不敢是yield,还是greenlet都没有实现检测io,实现遇到io切换效果 如果我们在单个线程内有20个任务,要想实现在多个任务之间切换,使用yield生成器的方式过于麻烦(需要先得到初始化一次的生成器,然后再调用send。。。非常麻烦),而使用greenlet模块可以 阅读全文
posted @ 2019-07-11 23:03 minger_lcm 阅读(184) 评论(0) 推荐(0) 编辑
摘要:协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的 需要强调的是: 对比操作系统控制线程的切换,用户在单线程内控制协程的切换 优点如下: 缺点如下: 总结协程特点: 阅读全文
posted @ 2019-07-11 23:02 minger_lcm 阅读(231) 评论(0) 推荐(0) 编辑
摘要:不应该让服务端随着 并发的客户端数量增多,而无数起线程,应该用线程池,限制线程数量,控制最大并发数 io密集型程序,最大并发数是2 客户端 服务端 阅读全文
posted @ 2019-07-08 00:07 minger_lcm 阅读(324) 评论(0) 推荐(0) 编辑
摘要:提交任务的两张方式: 1.同步调用 2.异步调用 同步调用:提交完任务后,就在原地等待任务执行完后,拿到结果,再执行下一行代码 同步调用,导致程序串行执行 异步调用:提交完任务后,不再原地等待任务执行完 回调函数 可以为进程池或线程池内的每个进程或线程绑定一个函数,该函数在进程或线程的任务执行完毕后 阅读全文
posted @ 2019-07-07 22:25 minger_lcm 阅读(4478) 评论(0) 推荐(0) 编辑
摘要:一 进程池与线程池 1.为什么需要进程池和线程池 基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是: 服务端的程序运行在一台机器身上,一台机器性能是有极限的,不能无限开线程 服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪 阅读全文
posted @ 2019-07-07 22:24 minger_lcm 阅读(1299) 评论(0) 推荐(0) 编辑
摘要:进程内会生成一个主线程,让主线程执行server函数,server函数核心是accept(),让主线程干accept的工作, 建立连接,每建立一个连接应该执行通信函数 每建立一个连接就是生成一个子线程 服务端 客户端 执行结果 阅读全文
posted @ 2019-07-06 19:03 minger_lcm 阅读(293) 评论(0) 推荐(0) 编辑
摘要:线程queue 线程之间已经是共享数据的,为什么还使用线程queue? 线程需要自己加锁,线程queue帮我们处理好加锁的问题 有三种不同的用法 第一种方法: class queue.Queue(maxsize=0) #队列:先进先出 put('four',block=,timeout=) 第一个参 阅读全文
posted @ 2019-07-06 19:01 minger_lcm 阅读(402) 评论(0) 推荐(0) 编辑