标签: fiber

枚举器如何在Ruby 1.9.1中工作?

这个问题不是关于如何在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.uptoFiber.yield它替换的产量很容易理解,但这不是这里的情况.这是一个普通的老yield,所以它是如何工作的?

我看了enumerator.c,但对我来说这是不可理解的.也许有人可以在Ruby中提供一个实现,使用光纤,而不是1.8.6样式的基于延续的枚举器,这一切都清楚了吗?

ruby enumerators fiber ruby-1.9

8
推荐指数
1
解决办法
5282
查看次数

C#中的纤维:它们比迭代器更快,并且让人们使用它们?

所以我正在和一位同事聊聊有关光纤的问题,在2003年发表这篇论文,描述了使用Fiber API在C#中实现协同程序.

本文的实现Yield是针对.NET 1.1的,因此它早yield return于.NET 2.0中出现的语法.

乍一看,它确实看起来这里的实现可能更快,并且可以很好地扩展到多个CPU.

有人用过吗?

c# yield coroutine fiber

8
推荐指数
2
解决办法
4120
查看次数

支持光纤/协同程序的脚本语言?

我想用一种语言来启动一个新的网络服务器项目,该语言通过光纤aka coroutines即用户模式线程来支持并发.确定我的选项究竟是什么一直非常困难,因为"coroutine"这个术语似乎用得很松散,意味着各种各样的东西,而"fiber"几乎只用于引用Win32 API.

为了这个问题的目的,协同程序/纤维:

  • 支持通过从嵌套函数中向调用函数生成结果来暂停执行的方法(即调用协程/光纤的调用堆栈中任意深度)
  • 支持将控制转移到当前执行点的另一个任意协程(即产生一个没有调用你的协程的协程)

我的语言选择是什么?我知道Ruby 1.9和Perl(Coro)都有支持,还有什么?任何具有成熟gc和动态方法调用的东西就足够了.

network-programming coroutine fiber

8
推荐指数
2
解决办法
1408
查看次数

分段堆栈如何工作

分段堆栈如何工作?这个问题也适用于Boost.Coroutine我所以我也在使用C++标签.主要的疑问来自这篇文章看起来他们所做的是在堆栈的底部保留一些空间并通过在那里分配的内存(可能通过mmapmprotect?)注册某种信号处理程序来检查它是否已经损坏了当他们发现他们已经耗尽了空间时,他们继续分配更多的内存,然后从那里继续.3个问题

  1. 这不是构建用户空间的东西吗?它们如何控制新堆栈的分配位置以及如何编译程序的指令以了解它?

    push指令基本上只是向堆栈指针添加一个值,然后将值存储在堆栈中的寄存器中,那么push指令如何知道新堆栈的启动位置以及相应的pop如何知道它何时必须将堆栈指针移回旧堆栈?

  2. 他们也说

    在我们得到一个新的堆栈段之后,我们goroutine通过重试导致我们用完堆栈的函数来重新启动它

    这是什么意思?他们重启整个goroutine吗?这不可能导致非确定性行为吗?

  3. 他们如何检测到程序已超出堆栈?如果他们在底部保留一个canary-ish内存区域,那么当用户程序创建一个足够大的数组溢出时会发生什么?这不会导致堆栈溢出并且是一个潜在的安全漏洞吗?

如果Go和Boost的实现不同,我很高兴知道它们中的任何一个如何处理这种情况

c++ go fiber goroutine boost-coroutine

8
推荐指数
1
解决办法
928
查看次数

FiberError - 跨线程调用的光纤

我正在尝试在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)

ruby ruby-on-rails fiber

7
推荐指数
1
解决办法
1048
查看次数

最小均方来均衡光纤通道

我使用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)

matlab telecommunication fiber least-squares modulation

7
推荐指数
1
解决办法
435
查看次数

Ruby并发/异步处理(具有简单的用例)

我正在研究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)?

ruby concurrency asynchronous fiber eventmachine

6
推荐指数
1
解决办法
1726
查看次数

Mac OS相当于Windows Fibers API?

我出于好奇而问这个问题.

Windows提供了他们所谓的Fibers API,它是轻量级用户进程/线程的API.

我有兴趣知道Mac OS是否也提供了这样的功能.据我所知,与此类似的最接近的Unix将是setcontext函数族.但是,尝试在Mac程序上调用此类API会产生警告,表示自OSX 10.6以来已弃用这些函数.此外,当我尝试编译并运行上面维基百科链接中提供的示例时,我首先在我的机器上遇到了seg故障swapcontext.

显然,setcontextAPI是不适合Mac的.至少不再是.有没有其他方法可以在Mac OS上实现轻量级用户端线程?系统是否提供此类功能?

c windows macos fiber

6
推荐指数
1
解决办法
944
查看次数

调用Email.send后,Meteor [错误:不能没有光纤等待]

我使用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)

timeout callback fiber meteor

6
推荐指数
1
解决办法
2471
查看次数

为什么在Ruby 1.9 Continuations是邪恶的?

我在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中踢出来?

ruby continuations fiber fibers continuation

5
推荐指数
0
解决办法
402
查看次数