摘要:
产生的问题 前面介绍了greenlet实现了协程,但是在遇到I/O操作时,还没实现自动切换,下面可以通过gevent模块实现该功能。 gevent的好处在于可以自动切换协程,一般来说I/O操作比较耗时,那么当一个协程在等待I/O时,它会自动切换到其他协程工作,这样就能够充分利用CPU了。 概述 Ge 阅读全文
摘要:
概述 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 定 阅读全文
摘要:
概述 之前不是说,多个进程间的内存都是独立的。在进程里面怎么也有锁的概念,为什么?虽然进程间都是独立运行的,但是他们共享同一块屏幕,所以为了避免打印出的数据不乱(加锁的情况下进程独占屏幕),所以加锁。 进程同步 用法:使用multiprocess模块中的Lock锁模块实现进程锁 进程池 作用:在使用 阅读全文
摘要:
进程间数据通信的实现方法 2.Pipe() Pipe()函数返回一对由管道连接的连接对象,代表了pipe的两端,默认情况下为双工(双向),每个对象都有send()和recv()方法。 区别和小结 pipe用来在两个进程间通信。queue用来在多个进程间实现通信。此两种方法为所有系统多进程通信的基本方 阅读全文
摘要:
概述 我们知道不同进程之间内存是不共享的,进程与进程间是相互独立的,如果一定要实现进程间的数据交换,那么应该如何实现呢? 实现方法 1.进程Queue 这里的进程queue和之前生产者消费者模型里面的线程queue有明显的区别: 线程间是共享内存的,所以线程间可以互相访问 进程间是内存不共享的,也就 阅读全文
摘要:
概述 我们之前了解了多线程,现在我们来了解下多进程,它是使用的是操作系统的原生进程,原生进程是操作系统自己维护的,因为进程间不能够相互访问,所以没有锁的概念,如果我的电脑是8核,我运行8个进程,同时在每个进程运行一个线程,那么这时,就有8线程了,充分利用多核,唯一的缺点是这8个线程之间的数据不共享, 阅读全文
摘要:
概述 队列在线程编程时特别有用,因为信息必须在多个线程之间安全地交换。 优先队列的构造函数。 maxsize是一个整数,用于设置可放入队列的项目数的上限。 一旦达到此大小,插入将会阻塞,直到队列项被消耗。 如果maxsize小于或等于零,队列大小是无限的。 首先检索最小值的条目(最低值条目是由排序的 阅读全文
摘要:
背景 在日常生活中经常遇到红绿灯,我们就很好理解红绿灯的例子,就是红灯停,绿灯行。 概述 我现在生成一个线程,这个线程我让它扮演红绿灯,它每过一段时间就变成绿灯,一会儿又变成红灯。然后我再生成3-5个线程作为车。车看见红灯,它就停下来等着,如果说是绿灯,车子就走。所以就涉及到红绿灯这个线程,红绿灯的 阅读全文
摘要:
背景 前面介绍了互斥锁的作用是同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 信号量 说明: 解析:程序的执行,给我们的感觉是分了5组,这5个同时完成,又同时进5个进去。但是实际的情况是这5个里面如果有3个完成,就会立刻再放3个进去。不会等5个都完成再进去,而是出来 阅读全文
摘要:
产生背景 两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。看下面的例子: 解析:按照程序自上而下执行,2个小门中的锁在同一时间应该只有一把加锁,但是在程序执 阅读全文