这个问题不是关于如何在Ruby 1.9.1中使用枚举器,而是我很好奇它们是如何工作的.这是一些代码:
class Bunk
def initialize
@h = [*1..100]
end
def each
if !block_given?
enum_for(:each)
else
0.upto(@h.length) { |i|
yield @h[i]
}
end
end
end
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我可以使用e = Bunk.new.each,然后e.next,e.next获取每个连续的元素,但它究竟是如何暂停执行然后在正确的位置恢复?
我知道,如果0.upto用Fiber.yield它替换的产量很容易理解,但这不是这里的情况.这是一个普通的老yield,所以它是如何工作的?
我看了enumerator.c,但对我来说这是不可理解的.也许有人可以在Ruby中提供一个实现,使用光纤,而不是1.8.6样式的基于延续的枚举器,这一切都清楚了吗?
我想用一种语言来启动一个新的网络服务器项目,该语言通过光纤aka coroutines即用户模式线程来支持并发.确定我的选项究竟是什么一直非常困难,因为"coroutine"这个术语似乎用得很松散,意味着各种各样的东西,而"fiber"几乎只用于引用Win32 API.
为了这个问题的目的,协同程序/纤维:
我的语言选择是什么?我知道Ruby 1.9和Perl(Coro)都有支持,还有什么?任何具有成熟gc和动态方法调用的东西就足够了.
分段堆栈如何工作?这个问题也适用于Boost.Coroutine我所以我也在使用C++标签.主要的疑问来自这篇文章看起来他们所做的是在堆栈的底部保留一些空间并通过在那里分配的内存(可能通过mmap和mprotect?)注册某种信号处理程序来检查它是否已经损坏了当他们发现他们已经耗尽了空间时,他们继续分配更多的内存,然后从那里继续.3个问题
这不是构建用户空间的东西吗?它们如何控制新堆栈的分配位置以及如何编译程序的指令以了解它?
push指令基本上只是向堆栈指针添加一个值,然后将值存储在堆栈中的寄存器中,那么push指令如何知道新堆栈的启动位置以及相应的pop如何知道它何时必须将堆栈指针移回旧堆栈?
他们也说
在我们得到一个新的堆栈段之后,我们
goroutine通过重试导致我们用完堆栈的函数来重新启动它
这是什么意思?他们重启整个goroutine吗?这不可能导致非确定性行为吗?
他们如何检测到程序已超出堆栈?如果他们在底部保留一个canary-ish内存区域,那么当用户程序创建一个足够大的数组溢出时会发生什么?这不会导致堆栈溢出并且是一个潜在的安全漏洞吗?
如果Go和Boost的实现不同,我很高兴知道它们中的任何一个如何处理这种情况
我正在尝试在Rails应用程序中编写一个小功能,该应用程序使用随机词gem生成随机名词,然后将其复数.我第一次访问开发中的页面时能够让它工作,但是我想让脚本在每次加载页面时再次运行.现在,后续页面加载(直到我反弹服务器)给我FiberError in WelcomeController#randomwords,fiber called across threads.我试图自己解决这个问题,但我对编程很陌生,并不太了解Fibers的工作原理.我尝试使用Queue,但无法弄清楚如何让它工作,再次因为我不完全理解这个类.我该如何解决这个具体问题?
资料来源:welcome_helper.rb
def random
noun = RandomWord.nouns.next.split('_').sample.pluralize
if noun.include? "_"
noun = noun.split("_").join.pluralize
else
noun.pluralize!
end
return noun
end
Run Code Online (Sandbox Code Playgroud) 我使用LMS的Matlab代码(最小均方算法)来均衡通道的效果,它适用于在MATLAB中生成的抽头延迟通道,但对于使用光谱系统程序的光纤通道,它不能正常工作,我认为问题在于光纤脉冲响应,因为它不是有限脉冲响应而且算法需要有限的脉冲响应但是如何解决这个问题呢?
在MATLAB通道和光纤通道的星座中,很明显第二个星座没有得到很好的均衡.
星座:

以下是LMS算法无法补偿其影响的噪声通道的示例,有没有办法在此SNR上增强其性能:
% // Set up parameters and signals.
M = 4; % // Alphabet size for modulation
msg = randint(15000,1,M); % // Random message
modmsg = pskmod(msg,M); % // Modulate using QPSK.
trainlen = 5000; % // Length of training sequence
chan = [.986; .845; .237; .123+.31i]; % // Channel coefficients
filtmsg = filter(chan,1,modmsg); % // Introduce channel distortion.
filtmsg=awgn(filtmsg,10,'measured');
% // Equalize the received signal.
eq1 = lineareq(8, lms(0.01)); % // Create an equalizer object.
eq1.SigConst …Run Code Online (Sandbox Code Playgroud) 我正在研究ruby的并行/异步处理功能,并阅读了许多文章和博客文章.我浏览了EventMachine,Fibers,Revactor,Reia等等.不幸的是,我无法为这个非常简单的用例找到一个简单,有效(和非IO阻塞)的解决方案:
File.open('somelogfile.txt') do |file|
while line = file.gets # (R) Read from IO
line = process_line(line) # (P) Process the line
write_to_db(line) # (W) Write the output to some IO (DB or file)
end
end
Run Code Online (Sandbox Code Playgroud)
你可以看到,我的小脚本正在执行三个操作:读取(R),处理(P)和写入(W).让我们假设 - 为简单起见 - 每个操作只花费1个单位时间(例如10ms),因此当前代码将执行类似这样的操作(5行):
Time: 123456789012345 (15 units in total)
Operations: RPWRPWRPWRPWRPW
Run Code Online (Sandbox Code Playgroud)
但是,我希望它能做到这样的事情:
Time: 1234567 (7 units in total)
Operations: RRRRR
PPPPP
WWWWW
Run Code Online (Sandbox Code Playgroud)
显然,我可以运行三个进程(读取器,处理器和写入器)并将读取器的读取行传递到处理器队列,然后将处理过的行传递到写入器队列(所有这些都通过例如RabbitMQ进行协调).但是,用例非常简单,感觉不对.
关于如何做到这一点的任何线索(没有从Ruby切换到Erlang,Closure或Scala)?
我出于好奇而问这个问题.
Windows提供了他们所谓的Fibers API,它是轻量级用户进程/线程的API.
我有兴趣知道Mac OS是否也提供了这样的功能.据我所知,与此类似的最接近的Unix将是setcontext函数族.但是,尝试在Mac程序上调用此类API会产生警告,表示自OSX 10.6以来已弃用这些函数.此外,当我尝试编译并运行上面维基百科链接中提供的示例时,我首先在我的机器上遇到了seg故障swapcontext.
显然,setcontextAPI是不适合Mac的.至少不再是.有没有其他方法可以在Mac OS上实现轻量级用户端线程?系统是否提供此类功能?
我使用Meteor创建了一个非常简单的服务器,在超时后发送电子邮件.当我使用超时时,消息已成功发送但引发错误:[Error: Can't wait without a fiber].
这是我的代码:
if (Meteor.isServer) {
Meteor.startup(function () {
// <DUMMY VALUES: PLEASE CHANGE>
process.env.MAIL_URL = 'smtp://me%40example.com:PASSWORD@smtp.example.com:25';
var to = 'you@example.com'
var from = 'me@example.com'
// </DUMMY>
//
var subject = 'Message'
var message = "Hello Meteor"
var eta_ms = 10000
var timeout = setTimeout(sendMail, eta_ms);
console.log(eta_ms)
function sendMail() {
console.log("Sending...")
try {
Email.send({
to: to,
from: from,
subject: subject,
text: message
})
} catch (error) {
console.log("Email.send error:", error)
}
}
})
} …Run Code Online (Sandbox Code Playgroud) 我在Ruby世界中相对较新.我不知道,该怎么想.在"Ruby编程语言"中,我读过我不应该在新代码中使用Continuations而是使用Fibers.我发现这个演示文稿(来自2008年)http://www.atdot.net/~ko1/pub/ContinuationFest-ruby.pdf,其中说Contination已经破坏,而他们Ruby实现的创建者都是犯罪分子.另一方面,我读了一些博客,其中作者表示他们对延续的兴奋,他们并没有对延续错误感到悲伤.所以我不知道该怎么想.我知道使用Fibers而不是Continuations更好,但是当Fibers不够时该怎么办?我可以使用Continuations还是它们坏了(2008年的演示文稿说明了这一点)?为什么Matz踢了stdlib的Continuations?为什么有选票,他会从Ruby中踢出来?
fiber ×10
ruby ×4
coroutine ×2
asynchronous ×1
c ×1
c# ×1
c++ ×1
callback ×1
concurrency ×1
continuation ×1
enumerators ×1
eventmachine ×1
fibers ×1
go ×1
goroutine ×1
macos ×1
matlab ×1
meteor ×1
modulation ×1
ruby-1.9 ×1
timeout ×1
windows ×1
yield ×1