文章分类 -  并发编程

摘要:asyncio asyncio是Python 3.4版本引入的标准库,直接内置了对异步IO的支持,更多信息 gevent Python通过yield提供了对协程的基本支持,但是不完全。而第三方的gevent为Python提供了比较完善的协程支持.更多信息 twisted Twisted是基于事件驱动 阅读全文
posted @ 2018-05-10 20:19 瓜田月夜 阅读(120) 评论(0) 推荐(0)
摘要:在多线程环境下,每个线程都有自己的数据。一个线程使用自己的局部变量比使用全局变量好,因为局部变量只有线程自己能看见,不会影响其他线程,而全局变量的修改必须加锁。 Threading.local可以创建一个对象,每个线程都可以对他读写属性,但不会互相影响 通过字典以及面向对象中的魔法方法来自己实现一个 阅读全文
posted @ 2018-04-23 19:52 瓜田月夜 阅读(334) 评论(0) 推荐(0)
摘要:http://blog.csdn.net/songfreeman/article/details/50735045 阅读全文
posted @ 2017-12-06 22:10 瓜田月夜 阅读(67) 评论(0) 推荐(0)
摘要:socketserver socketserver内部使用IO多路复用以及“多线程”和“多进程”,从而实现并发处理多个客户端请求的scoket服务端。即,每个客户端请求连接到服务器时,socket服务端都会在服务器是创建一个“线程”或“进程”专门负责处理当前客户端的所有请求。 ThradingTCP 阅读全文
posted @ 2017-12-06 22:02 瓜田月夜 阅读(148) 评论(0) 推荐(0)
摘要:多进程-利用了多核优势,python因为GIL锁的存在导致了同一时间一个进程中只有一个线程在运行,单个进程无法利用多核优势 多线程-在进程中遇到IO切,降低了进程的IO阻塞。 协程-单线程内实现并发,降低了线程内的IO阻塞。 他们提高了CPU的利用率 阅读全文
posted @ 2017-12-06 20:21 瓜田月夜 阅读(98) 评论(0) 推荐(0)
摘要:为了更好地了解IO模型,我们需要事先回顾下:同步、异步、阻塞、非阻塞 同步: 异步: 阻塞: 非阻塞: IO模型 阻塞IO(blocking IO) 默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样 接收端调用recvfrom这个系统调用,要收到数据要经历发送端准备数 阅读全文
posted @ 2017-12-06 18:01 瓜田月夜 阅读(188) 评论(0) 推荐(0)
摘要:所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程,如下就是死锁 from threading import Thread,Lock impor 阅读全文
posted @ 2017-12-05 19:46 瓜田月夜 阅读(125) 评论(0) 推荐(0)
摘要:协程--只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。 并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长 一:其中第二种情况并不能提升效率,只是为了让cpu 阅读全文
posted @ 2017-12-05 19:00 瓜田月夜 阅读(80) 评论(0) 推荐(0)
摘要:全局解释器锁(Global Interpreter Lock)是计算机程序设计语言解释器用于同步线程的工具,使得任何时刻仅有一个线程在执行。常见例子有CPython(JPython不使用GIL)与Ruby MRI。 GIL本质就是一把互斥锁,既然是互斥锁,所有互斥锁的本质都一样,都是将并发运行变成串 阅读全文
posted @ 2017-12-05 16:22 瓜田月夜 阅读(100) 评论(0) 推荐(0)
摘要:生产者消费者模型 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么要使用生产者和消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。在多线程开发当中,如果生产者处理速度很快,而消费 阅读全文
posted @ 2017-12-04 20:02 瓜田月夜 阅读(84) 评论(0) 推荐(0)
摘要:进程队列 进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列和管道,这两种方式都是使用消息传递的 创建队列的类 创建实例 代码 线程队列 queue队列 :使用import queue,用法与进程Queue一样 队列 优先级队列 堆栈 阅读全文
posted @ 2017-12-04 19:45 瓜田月夜 阅读(75) 评论(0) 推荐(0)
摘要:信号量规定了能够同时进行这个功能的进程或线程的个数。 进程互斥锁的信号量 信号量与池的不同是池规定的是同时工作的进程或线程的最大数量,而信号量规定的是同时处理一个任务的最大进程或线程数量。 信号量中可以有多个进程或线程,但处理那个任务的进程或线程不超过设定的最大值。 线程互斥锁的信号量 线程互斥锁信 阅读全文
posted @ 2017-12-04 19:05 瓜田月夜 阅读(101) 评论(0) 推荐(0)
摘要:进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终端 加锁后由并发变成了串行 互斥锁与join的区别 join是等一个进程运行完后下一个进程才运行,而互斥锁是进程都执行了 阅读全文
posted @ 2017-12-04 17:21 瓜田月夜 阅读(90) 评论(0) 推荐(0)
摘要:创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children 注意:进程之间是互相独立的,主进程代码运行结束,守护进程 阅读全文
posted @ 2017-12-04 16:26 瓜田月夜 阅读(126) 评论(0) 推荐(0)
摘要:同样一个进程中不可能无限开辟线程,于是就有了线程池,线程池的作用与进程池相似,是规定了开辟最大线程数。 开启线程池的方法 开辟线程池的方法与开辟进程池相似,是由concurrent.futurse 导入ThreadPoolExecutor类 阅读全文
posted @ 2017-12-01 20:09 瓜田月夜 阅读(91) 评论(0) 推荐(0)
摘要:创建多线程 开启线程同样可以使用继承类 其他方法 #current_thread()返回进程信息,current_thread().getName() #返回进程名字 #enumerate # 查看当前进程 # active_count # 查看进程数 #这些都要从threadind中导入 #多线程 阅读全文
posted @ 2017-12-01 19:16 瓜田月夜 阅读(155) 评论(0) 推荐(0)
摘要:什么是线程 先来说一下什么是进程,进程时一个程序的过程,负责把资源整合到一起,是一个资源单位 而线程是CPU的执行单位,一个进程内默认就会有一个控制线程,该控制线程可以执行代码从而创建新的线程该控制线程的执行周期就代表改进程的执行周期。一个程序运行首先要申请一个内存空间这就开启了一个进程, 线程就是 阅读全文
posted @ 2017-12-01 16:51 瓜田月夜 阅读(105) 评论(0) 推荐(0)
摘要:就像tcp套接字的listen一样,服务器并不能同时大量的的处理连接请求,所以有了listen来使连接请求不超过设定值,处理完一个便有一个加入进来 同样在 操作系统中并发执行的任务通常大于核数 操作系统不可能无线开启进程,进程开启过多,效率反而会下降(开启进程是需要占用系统资源的,而且开启多余核数目 阅读全文
posted @ 2017-11-30 18:14 瓜田月夜 阅读(145) 评论(0) 推荐(0)
摘要:方式一 方式二(不常用) 继承Process类 from multiprocessing import Process import time # class Myprocess(Process): def __init__(self,name): super().__init__() self.n 阅读全文
posted @ 2017-11-30 14:41 瓜田月夜 阅读(170) 评论(0) 推荐(0)
摘要:进程 进程-顾名思义就是正在执行的一个过程。进程是对正在运行程序的一个抽象。 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一。操作系统的其他所有内容都是围绕进程的概念展开的。 必备的理论基础 #一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供 阅读全文
posted @ 2017-11-29 17:13 瓜田月夜 阅读(126) 评论(0) 推荐(0)