- 浏览: 1632975 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (405)
- C/C++ (16)
- Linux (60)
- Algorithm (41)
- ACM (8)
- Ruby (39)
- Ruby on Rails (6)
- FP (2)
- Java SE (39)
- Java EE (6)
- Spring (11)
- Hibernate (1)
- Struts (1)
- Ajax (5)
- php (2)
- Data/Web Mining (20)
- Search Engine (19)
- NLP (2)
- Machine Learning (23)
- R (0)
- Database (10)
- Data Structure (6)
- Design Pattern (16)
- Hadoop (2)
- Browser (0)
- Firefox plugin/XPCOM (8)
- Eclise development (5)
- Architecture (1)
- Server (1)
- Cache (6)
- Code Generation (3)
- Open Source Tool (5)
- Develope Tools (5)
- 读书笔记 (7)
- 备忘 (4)
- 情感 (4)
- Others (20)
- python (0)
最新评论
-
532870393:
请问下,这本书是基于Hadoop1还是Hadoop2?
Hadoop in Action简单笔记(一) -
dongbiying:
不懂呀。。
十大常用数据结构 -
bing_it:
...
使用Spring MVC HandlerExceptionResolver处理异常 -
一别梦心:
按照上面的执行,文件确实是更新了,但是还是找不到kernel, ...
virtualbox 4.08安装虚机Ubuntu11.04增强功能失败解决方法 -
dsjt:
楼主spring 什么版本,我的3.1 ,xml中配置 < ...
使用Spring MVC HandlerExceptionResolver处理异常
Ruby1.9提供了Fiber,提供了Coroutine的功能。
Fibers作为实现轻量级合作并发的基础设施,和线程很像,提供了创建一个可以pause和resume的代码块,
但Fibers是非抢占式的,必须由程序而不是VM来调度。每一个fiber提供了4kB的栈空间可以允许fiber的
block进行深层嵌套函数调用。这是rdoc对Fiber的描述。
Ruby的Fiber就是传说中Coroutine的实现,在lua中,coroutine被广泛使用。Ruby中coroutine的
强大功能,势必会被发扬光大。Ruby中的Fiber和lua中的coroutine基本类似,都是asymmetric coroutine,
都提供了new/create,resume和yield的操作。
看个rdoc的例子:
Fiber有三种状态:suspend、running、dead。Fiber被new之后处于suspend状态,当调用resume时开始运行(running),coruntine执行的block完毕或者出错时dead.
上面的例子,我们new一个fiber,这时fiber处于suspend,当我们调用resume的时候,开始执行,Fiber.yield
放弃当前的执行控制,将控制权交给resume的调用者。第二次调用fiber.resume时从Fiber.yeild 1返回,开始执行下一句代码,这时这个fiber执行完毕,所以第三次调用时fiber已经dead。
resume参数可以是任何个,第一次调用的时候作为block的参数,后面的调用作为yield的返回值。
通过上面我们已经熟悉了Coroutine,下面我们创建一个fib数列生成器的coroutine,小小练习一下:
coroutinue最常用的场合就是合作并发的程序,producer和consumer是最典型的方式:
一个偶数生产者和消费者:
在加点东东,加个过滤器,我只想要是3的倍数的偶数:
我们看到可以像Unix的管道一样将多个coroutine连结起来,我们甚至可以定义像Unix shell一样的
管道操作符Pipelines Using Fibers in Ruby 1.9:
even_producer | multiple_of_three_filter | consumer
使用shell的管道每次需要创建一个进程,而使用coroutine每次只需要创建一个轻量级的Fiber
关于asymmetric coroutine和symmetric coroutine
1)asymmetric coroutine:提供了两种控制转换操作:(re)invoking和suspending一个coroutine,suspending将控制流程返回给coroutine的调用者。这个过程和调用和被调用的routine类似(routine在现代语言中被实现为函数、方法、过程,又叫subroutine),所以这种方式非常容易被使用传统编程语言的程序员接受,这也是大多数语言实现asymmetric coroutine的原因之一,其他的原因:比如lua是和c/c++结合比较紧密的语言,如果实现symmetric coroutine则要求c/c++支持coroutine,这显然是不现实的,另外symmetric的也很容易用asymmetric描述。
2)symmetric coroutine:只提供了一种控制上述操作的操作。
Fibers作为实现轻量级合作并发的基础设施,和线程很像,提供了创建一个可以pause和resume的代码块,
但Fibers是非抢占式的,必须由程序而不是VM来调度。每一个fiber提供了4kB的栈空间可以允许fiber的
block进行深层嵌套函数调用。这是rdoc对Fiber的描述。
Ruby的Fiber就是传说中Coroutine的实现,在lua中,coroutine被广泛使用。Ruby中coroutine的
强大功能,势必会被发扬光大。Ruby中的Fiber和lua中的coroutine基本类似,都是asymmetric coroutine,
都提供了new/create,resume和yield的操作。
看个rdoc的例子:
fiber = Fiber.new do Fiber.yield 1 2 end puts fiber.resume #=>1 puts fiber.resume #=>2 puts fiber.resume #=>FiberError: dead fiber called
Fiber有三种状态:suspend、running、dead。Fiber被new之后处于suspend状态,当调用resume时开始运行(running),coruntine执行的block完毕或者出错时dead.
上面的例子,我们new一个fiber,这时fiber处于suspend,当我们调用resume的时候,开始执行,Fiber.yield
放弃当前的执行控制,将控制权交给resume的调用者。第二次调用fiber.resume时从Fiber.yeild 1返回,开始执行下一句代码,这时这个fiber执行完毕,所以第三次调用时fiber已经dead。
resume参数可以是任何个,第一次调用的时候作为block的参数,后面的调用作为yield的返回值。
fiber = Fiber.new do |first| second = Fiber.yield first + 2 end puts fiber.resume 10 #12 puts fiber.resume 14 #14 puts fiber.resume 18 #FiberError: dead fiber called
通过上面我们已经熟悉了Coroutine,下面我们创建一个fib数列生成器的coroutine,小小练习一下:
fib = Fiber.new do x, y = 0, 1 loop do Fiber.yield y x,y = y,x+y end end 20.times { puts fib.resume }
coroutinue最常用的场合就是合作并发的程序,producer和consumer是最典型的方式:
一个偶数生产者和消费者:
def even_producer #even number producer Fiber.new do value = 0 loop do Fiber.yield value value += 2 end end end def consumer(source) Fiber.new do 10.times do next_val = source.resume puts next_val end end end consumer(even_producer).resume
在加点东东,加个过滤器,我只想要是3的倍数的偶数:
def multiple_of_three_filter(source) Fiber.new do loop do next_val = source.resume Fiber.yield next_val if next_val % 3 == 0 end end end consumer(multiple_of_three_filter(even_producer)).resume
我们看到可以像Unix的管道一样将多个coroutine连结起来,我们甚至可以定义像Unix shell一样的
管道操作符Pipelines Using Fibers in Ruby 1.9:
even_producer | multiple_of_three_filter | consumer
class PipelineElement attr_accessor :source def initialize @fiber_delegate = Fiber.new do process end end def |(other) other.source = self other end def resume @fiber_delegate.resume end def process while value = input handle_value(value) end end def handle_value(value) output(value) end def input source.resume end def output(value) Fiber.yield(value) end end class EvenProducer < PipelineElement def process value = 0 loop do output(value) value += 2 end end end class MultipleOf < PipelineElement def initialize(factor) @factor = factor super() end def handle_value(value) output(value) if value % @factor == 0 end end even_producer = EvenProducer.new multiples_of_three_filter = MultipleOf.new(3) multiples_of_seven_filter = MultipleOf.new(7) pipeline = even_producer | multiples_of_three_filter | multiples_of_seven_filter 10.times do puts pipeline.resume end
使用shell的管道每次需要创建一个进程,而使用coroutine每次只需要创建一个轻量级的Fiber
关于asymmetric coroutine和symmetric coroutine
1)asymmetric coroutine:提供了两种控制转换操作:(re)invoking和suspending一个coroutine,suspending将控制流程返回给coroutine的调用者。这个过程和调用和被调用的routine类似(routine在现代语言中被实现为函数、方法、过程,又叫subroutine),所以这种方式非常容易被使用传统编程语言的程序员接受,这也是大多数语言实现asymmetric coroutine的原因之一,其他的原因:比如lua是和c/c++结合比较紧密的语言,如果实现symmetric coroutine则要求c/c++支持coroutine,这显然是不现实的,另外symmetric的也很容易用asymmetric描述。
2)symmetric coroutine:只提供了一种控制上述操作的操作。
评论
1 楼
boreas_baosj
2011-04-02
为什么我每次搜索WSRM1124: No sequence registered with id,都搜到你这篇文章,而且google的快照下面也有显示这个关键字。但是貌似此帖并不是说这个问题的。
LZ是不是写过类似的帖子呢,如果有解决这个错误的方法,请赐教。
错误:com.sun.xml.ws.rx.rm.runtime.sequence.UnknownSequenceException: WSRM1124: No sequence registered with id [ urn:uuid:414e525a-3b88-41b0-8145-cb33abac137a ]
帖子:http://www.iteye.com/problems/61911
在java.net上看到这样的方式试了也是不行
http://forums.java.net/node/686822
LZ是不是写过类似的帖子呢,如果有解决这个错误的方法,请赐教。
错误:com.sun.xml.ws.rx.rm.runtime.sequence.UnknownSequenceException: WSRM1124: No sequence registered with id [ urn:uuid:414e525a-3b88-41b0-8145-cb33abac137a ]
帖子:http://www.iteye.com/problems/61911
在java.net上看到这样的方式试了也是不行
http://forums.java.net/node/686822
发表评论
-
松本行弘的程序世界
2011-10-02 16:49 1340全书涉及到程序设计的方方面面,买这边书的目的希望能看到看看Ru ... -
Ruby HTTP/HTML parser相关资源
2011-09-28 12:04 1785Net::HTTP: http://ruby-doc.org ... -
命令行词典
2011-09-27 14:50 1974经常要查单词,所以利用qq dict api写了一个命令行词典 ... -
构建自己的DSL之三 抓取文件管理
2011-07-18 23:26 1696转载请标明出处:http://fuliang.iteye.co ... -
构建自己的DSL之二 抓取文本处理
2011-07-11 23:18 2240转载请标明出处:http://fuliang.iteye.co ... -
构建自己的DSL之一 Simple Crawler
2011-07-11 22:08 2954转载请标明出处:http://fuliang.iteye.co ... -
轻松删除所有安装的gem
2011-06-13 12:28 7928删除安装所有的gem: gem list | cut -d ... -
Ruby发送json请求
2011-05-05 18:37 5806require 'net/http' require ' ... -
写个简单的汉语bigram tokenizer
2011-01-23 23:29 1559写个简单的汉语bigram tokenizer,基本能够满足文 ... -
写段代码看看别人都怎么称呼你网站的?
2011-01-23 20:49 2117步骤很简单: 1)使用google的搜索inlink的语法li ... -
Ruby1.9 lambda操作符
2011-01-09 13:35 1349Ruby1.9提供了lambda操作符,使得lambda表达式 ... -
Ruby 1.9 regex (named capture group)
2011-01-08 22:57 2060Ruby 1.9正则增加了支持命名组,这样使得正则具有更好的可 ... -
Ruby Enumerators
2011-01-02 21:13 2288一个enumerator是一个用来枚举其他对象的Enumera ... -
Ruby Proc curry化
2011-01-01 23:11 1599Ruby 1.9 Proc增加了curry方法,可以将Proc ... -
Lazy evaluation in Ruby
2011-01-01 21:49 11881.使用||延迟初始化 def fib(n) ... -
One line Ruby code
2010-12-31 23:03 1182经常使用perl来代替一行的sed awk,主要是想使用per ... -
函数对象作为case语句中的条件
2010-12-31 22:28 1076Ruby 1.9的Proc#===作为call的一个别名,所以 ... -
从hash快速生成URL参数
2010-12-31 21:03 1905key_values = { :key1 => ... -
生成长度为n的随机字符串
2010-12-31 20:50 1597包含数字和小写字母的随机串 def gen_random_ ... -
Returning
2010-12-31 20:34 1517我们经常做的事情是创建一个对象,操作这个对象,然后返回这个对象 ...
相关推荐
Coroutine源码
Coroutine_Source_Test
David Beazley作的关于Python并发coroutine的介绍slides
基于linux cpp实现的协程库coroutine
每个协程是一个独立的执行单元,为了能够方便协程之前的通信/同步,coroutine_event提供了chan这种机制。它本质上类似于一个阻塞消息队列,但是它不一定FIFO。它支持在多个线程里面的多个协程之间通信,但不同的线程...
Coroutine是基于Kilim/Promise JDeferred的协程式驱动框架,基于Apache Zookeeper的分布式规则存储和动态规则变更通知。 主要特性: 1. 基于微服务框架理念设计 2. 支持同步/异步调用 3. 支持串行/并行调用 4....
开源的c++协程实现,包含头文件即可使用详见https://github.com/tonbit/coroutine
Lua Coroutine,协程详解,lua 基本础,The Programming Language Lua
安卓 Kotlin Coroutine协程 使用方式代码举例: 包含GlobalScope 、CoroutineScope 详细使用代码举例,相关介绍文章,可参考: https://xiaxl.blog.csdn.net/article/details/123383727
C++20 Coroutine PPT
The concept of a coroutine is one of the oldest proposals for a general control abstraction. It is attributed to Conway [Conway, 1963], who described coroutines as “subroutines who act as the master ...
在C++里,一个函数如果其函数体实现中包含co_await、co_yield、co_return中任何一个关键字,那么这个函数就是一个coroutine。其中: co_await:挂起当前的coroutine co_return:从当前coroutine返回一个结果 co_...
您可以先使用coroutine_open打开一个计划,然后在该计划中创建coroutine。 您应该在调用coroutine_open的线程中调用coroutine_resume,并且不能在同一调度中的协程中调用它。 相同计划中的协程共享堆栈,因此您...
然而,为了管理我们额外开启的线程,Unity3D将协同程序的调用放在了MonoBehaviour中,这样我们在编程时就可以方便的调用指定脚本中的协同程序,而不是
test for lua coroutine and linux makecontext
boost.coroutine2 boost.coroutine2提供了用于通用子例程的模板,该模板允许多个入口点在某些位置挂起和恢复执行。 它保留了执行的本地状态,并允许多次输入子例程(如果必须在函数调用之间保持状态,则很有用)。 ...
代码如下:void func1(){ coroutine.yield();} void func2(Coro_t co1){ coroutine.resume(co1); coroutine.yield();} void func(){ Coro_t co1 = coroutine.create(std::bind(&func1)); coroutine.resume(co1)...
awaitable coroutine library for C
Unity的协程技术,有可以用的朋友不妨看一下!如果本书不好不喜勿喷
loco(log coroutine)是一个在android上使用coroutine的日志库。