05: greenlet:轻量级的并发编程
网络编程其他篇
1.1 greenlet简介
1、greenlet原理 & 使用
1. greenle间切换
1)一个 “greenlet” 是一个很小的独立微线程,可以把它想像成一个堆栈帧,栈底是初始调用,而栈顶是当前greenlet的暂停位置。
2)你使用greenlet创建一堆这样的堆栈,然后在他们之间跳转执行。
3)跳转不是绝对的:一个greenlet必须选择跳转到选择好的另一个greenlet,这会让前一个挂起,而后一个恢复,
两 个greenlet之间的跳转称为 切换(switch) 。
2. 每个greenlet生命周期
1)当你创建一个greenlet,它得到一个初始化过的空堆栈;
2)当你第一次切换到它,他会启动指定的函数,然后切换跳出greenlet。
3)当最终栈底 函数结束时,greenlet的堆栈又变成空的了,greenlet也会因为一个未捕捉的异常死掉。
#! /usr/bin/env python
# -*- coding: utf-8 -*-
from greenlet import greenlet
def test1():
print 12
gr2.switch()
print 34
def test2():
print 56
gr1.switch()
print 78
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch() '''打印结果:12 56 34 (test2的78不会打印)'''
# 1、最后一行跳转到 test1() ,它打印12
# 2、然后跳转到 test2() ,打印56
# 3、然后跳转回 test1() ,打印34
# 4、然后 test1() 就结束,gr1死掉
# 5、这时执行会回到原来的 gr1.switch() 调用。
#### 注意,78是不会被打印的,因为gr1已死,不会再切换。
greenlet官方事例
2、greenlet与线程比较
1)线程是抢占式的调度,多个线程并行执行,抢占共同的系统资源;而微线程是协同式的调度。
2)其实greenlet不是一种真正的并发机制,而是在同一线程内,在不同函数的执行代码块之间切换
3)实施“你运行一会、我运行一会,并且在进行切换时必须指定何时切换以及切换到哪。
实质:
1. greelet指的是使用一个任务调度器和一些生成器或者协程实现协作式用户空间多线程的一种伪并发机制,即所谓的微线程。
2. greelet机制的主要思想是:生成器函数或者协程函数中的yield语句挂起函数的执行,直到稍后使用next()或send()操作进行恢复为止。
3. 可以使用一个调度器循环在一组生成器函数之间协作多个任务。
05: greenlet:轻量级的并发编程的更多相关文章
- greenlet:轻量级的并发编程
1 关于greenlet greelet指的是使用一个任务调度器和一些生成器或者协程实现协作式用户空间多线程的一种伪并发机制,即所谓的微线程. greelet机制的主要思想是:生成器函数或者协程函数中 ...
- 并发编程 05—— Callable和Future
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 01—— ThreadLocal
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 20—— AbstractQueuedSynchronizer 深入分析
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 02—— ConcurrentHashMap
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 04——闭锁CountDownLatch 与 栅栏CyclicBarrier
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 06—— CompletionService :Executor 和 BlockingQueue
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 10—— 任务取消 之 关闭 ExecutorService
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
随机推荐
- iOSOpenDev安装使用
下载:http://iosopendev.com/download/ 选择“iOSOpenDev 1.6-2 Installer” 出错解决方法 https://www.jianshu.com/p/2 ...
- android 流程跟踪
#记录一下 Thread cur_thread = Thread.currentThread(); StackTraceElement stack[] = cur_thread.getStackTra ...
- cocos2dx 3.x(加载网络自定义头像)
// // Connection.h // XXDemo // // Created by LeeHonGee on 14-9-4. // // #ifndef __XXDemo__Connec ...
- 测试一体机ASM failgroup的相关问题处理
环境:3台虚拟机 RHEL 7.3 + Oracle RAC 11.2.0.4 问题现象:RAC运行正常,ASM磁盘组Normal冗余,有failgroup整体故障,有failgroup配置错误. 温 ...
- 突然pom.xml中引用的jar包出错。
在你的本地仓库中,用window搜索包含.lastupdated的文件,全部删除!然后再去项目上maven ------update project
- Linux的文件最大连接数
[最大连接数]Linux的文件最大连接数 查看当前操作系统连接数设置 ulimit -a ==================================== 修改服务器最大连接数 vim / ...
- DataGridView常用属性和方法
DataGridView常用属性: 只读属性设定 datagridview.ReadOnly = True 行自动追加 datagridview.AllowUserToAddRows = ...
- div上下左右居中方法
方法一:在浏览器中只有一个div的情况 { position:fixed; position:fixed; ; ; ; ; margin:auto; } 方法一 方法二:一个父元素div和一个已知宽度 ...
- Unity shader学习之Alpha Test的阴影
Alpha Test的阴影, shader如下: // Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClip ...
- Java IO/NIO教程
Java IO教程 http://tutorials.jenkov.com/java-io/index.html Java NIO教程 英文版: http://tutorials.jenkov.com ...