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—— 闭 ...
随机推荐
- Linux下修改MySQL数据库字符编码为UTF-8解决中文乱码
由于MySQL编码原因会导致数据库出现乱码. 解决办法: 修改MySQL数据库字符编码为UTF-8,UTF-8包含全世界所有国家需要用到的字符,是国际编码. 具体操作: 1.进入MySQL控制台 &g ...
- cocos2dx - Lua 语言
快捷注释: - -[[ print(10) - ->10 - - 不起作用(因为这是注释) - -]] 当重新启用这段代码时,只需在一次行行首添加一个连接字符即可: - - -[[ print ...
- jQuery显示隐藏
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- jQuery绑定事件方法及区别(bind,click,on,live,one)
第一种方式: ? 1 2 3 4 5 $(document).ready(function(){ $("#clickme").click(function(){ alert(& ...
- centos6.5安装无线网卡驱动并配置wifi
1.驱动下载地址: RTL8188无线网卡驱动下载 链接:https://pan.baidu.com/s/1ms-EbQCDxa76jPhYUPmr9Q 密码:r2vu 2.安装步骤: [root@c ...
- django后台将最新文章显示在前面
在你定义的views.py中修改 Models.objects.order_by("-pub_date") 更据时间排列 Models.objects.order_by(&q ...
- vs远程调试 转http://www.cnblogs.com/magicchaiy/archive/2013/05/28/3088274.html
远程调试应用场景 部署环境:ASP.NET(C#)+IIS+Win7 64 bit 很多公司的开发模式都是将开发机器和服务器分开,也就是开发一台机,服务器一台机.而测试人员会在服务器上录入测试数据,此 ...
- Linux 查看磁盘或文件夹及文件大小
当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. du可以查看文件及文件夹的大小. ...
- Sitecore CMS中的项目如何配置帮助文本
如何在Sitecore CMS中的项目上配置帮助文本. 所有Sitecore项目都有长短描述字段,以及“帮助链接”字段.这些字段有助于向内容编辑者提供其他信息.这对于很少编辑的项目和字段尤其重要,因为 ...
- mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...