问题标签 [fiber]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
10425 浏览

multithreading - 进程、线程、绿色线程、protothreads、fibers、协程:有什么区别?

我正在阅读并发性。对于具有令人困惑的相似定义的术语,我有点不知所措。即:

  • 流程
  • 线程
  • 《绿线》
  • 原型线程
  • 纤维
  • 协程
  • Go 语言中的“Goroutines”

我的印象是,区别在于 (1) 是真正并行还是多路复用;(2) 是否在 CPU、操作系统或程序中进行管理;和(3..5)其他一些我无法识别的东西。

是否有关于这些并行方法之间差异的简洁明了的指南?

0 投票
2 回答
1765 浏览

ruby - Ruby concurrency/asynchronous processing (with simple use case)

I was looking into ruby's parallel/asynchronous processing capabilities and read many articles and blog posts. I looked through EventMachine, Fibers, Revactor, Reia, etc, etc. Unfortunately, I wasn't able to find a simple, effective (and non-IO-blocking) solution for this very simple use case:

Is you can see, my little script is performing three operations read (R), process (P) & write (W). Let's assume - for simplicity - that each operation takes exactly 1 unit of time (e.g. 10ms), the current code would therefore do something like this (5 lines):

But, I would like it to do something like this:

Obviously, I could run three processes (reader, processor & writer) and pass read lines from reader into the processor queue and then pass processed lines into the writer queue (all coordinated via e.g. RabbitMQ). But, the use-case is so simple, it just doesn't feel right.

Any clues on how this could be done (without switching from Ruby to Erlang, Closure or Scala)?

0 投票
2 回答
653 浏览

ruby-on-rails - 防止ffmpeg接管stdout

当我这样做时,system "ffmpeg -i just-do-it.mp4 -ab 96k -ar 22050 -qscale 6 output.flv"ffmpeg 会接管 ruby​​ 进程,直到工作完成,这有时需要很长时间。我尝试在 Ruby 中使用线程 amd fork 无济于事,同样的system命令也像exec %x[]我也在 ruby​​ 1.9.2 中尝试了最新的 Fibers,但我认为我没有正确使用它。

我的问题是如何同时从 ruby​​ 运行两个 ffmpeg 进程?

编辑:

0 投票
1 回答
134 浏览

fiber - 纤维有优先级吗?

纤程被定义为轻量级线程,线程具有优先级,因为它们是抢先调度的。然而,既然光纤是合作的,它们是否也有优先级?

0 投票
1 回答
638 浏览

ruby - 纤维#活着?没有定义的

我使用 ruby​​1.9.2p180(2011-02-18 修订版 30909)i686-linux。Fiber#alive?返回一个未定义的错误:

其他方法,例如,Fiber#resume似乎Fiber.yield工作正常。怎么了?

顺便问一下,Fiber#resume和 和有什么不一样Fiber#transfer

0 投票
2 回答
740 浏览

ruby - Sinatra 会话未使用 Rack::FiberPool 保留

请求之间不会保留会话,但我看不出我做错了什么。代码!

0 投票
0 回答
408 浏览

ruby - 为什么在 Ruby 1.9 中延续是邪恶的?

我在 Ruby 世界中相对较新。我不知道,该怎么想。在“Ruby 编程语言”中,我读到我不应该在新代码中使用 Continuations 而是使用 Fibers。我发现了这个演示文稿(从 2008 年开始)http://www.atdot.net/~ko1/pub/ContinuationFest-ruby.pdf它说 Continations 被破坏了,他们的 Ruby 实现的创建者是罪犯。另一方面,我阅读了一些博客,其中作者对延续感到兴奋,而他们对延续错误并不感到难过。所以我不知道该怎么想。我知道使用 Fibers 而不是 Continuations 更好,但是当 Fibers 不够时该怎么办?我可以使用 Continuations 还是它们坏了(2008 年的演示文稿这么说)?为什么 Matz 将 Continuations 踢到 stdlib?为什么有票,他会把它踢出鲁比?

0 投票
2 回答
3223 浏览

ruby - 红宝石线程块?

我在某处读到红宝石线程/纤维即使使用 1.9 也会阻塞 IO。这是真的吗?它的真正含义是什么?如果我在多个线程上执行一些 net/http 操作,那么在给定时间是否只有 1 个线程针对该请求运行?

谢谢

0 投票
1 回答
751 浏览

winapi - 启用异常链验证 (SEHOP) 的光纤的 SEH 设置

我正在研究原生光纤/协程实现——相当标准,对于每个光纤,分配一个单独的堆栈,并且为了切换上下文,寄存器被推送到源上下文堆栈并从目标堆栈中弹出。它运作良好,但现在我遇到了一个小问题:

我需要 SEH 在纤程内工作(如果程序终止或奇怪的事情开始发生,直到纤程的最后一个堆栈帧之前未处理异常,这没关系,它不会)。只是在上下文切换期间保存/恢复FS:[0](显然与FS:[4]and一起FS:[8])并最初为新分配的纤程设置 FS:[0] 0xFFFFFFFF(以便在上下文切换后设置的异常处理程序将成为链的根)几乎可以工作。

准确地说,它适用于我测试过的所有非服务器 Windows 操作系统——问题是 Windows Server 2008 和 2008 R2 默认启用了异常链验证(SEHOP、SEH 覆盖保护)功能,这使得RaiseException检查原始处理程序是否(在 ntdll.dll 中的某处)仍然是链的根,并立即终止程序,就好像没有安装任何处理程序一样。

因此,我面临着在堆栈上构建适当的根框架以保持验证代码满意的问题。是否有任何(隐藏的?)API 函数我可以调用来做到这一点,还是我必须弄清楚需要什么才能让RtlDispatchException朋友开心并_EXCEPTION_REGISTRATION自己构建适当的条目?我不能只重用创建线程中的 Windows 提供的地址,因为它会位于错误的地址(SEH 实现还检查处理程序地址是否在 and 给出的边界内FS:[4]FS:[8]并且还可能检查地址顺序是否一致)。

哦,我强烈希望诉诸CreateFiberWinAPI 系列函数。

0 投票
1 回答
285 浏览

ruby - 中途戒烟后该怎么办

一旦我在一个 Fiber 实例的中间完成fiber,即我yield从它中编辑而没有完成它,并且我不再使用它,fiber我该怎么处理它?我应该明确地销毁它,还是有类似killFiber 的东西,或者它会被正确地收集起来?如果是,那么 Ruby 怎么知道我fiber.resume将来会不会去呢?