问题标签 [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.
multithreading - 进程、线程、绿色线程、protothreads、fibers、协程:有什么区别?
我正在阅读并发性。对于具有令人困惑的相似定义的术语,我有点不知所措。即:
- 流程
- 线程
- 《绿线》
- 原型线程
- 纤维
- 协程
- Go 语言中的“Goroutines”
我的印象是,区别在于 (1) 是真正并行还是多路复用;(2) 是否在 CPU、操作系统或程序中进行管理;和(3..5)其他一些我无法识别的东西。
是否有关于这些并行方法之间差异的简洁明了的指南?
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)?
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 进程?
编辑:
fiber - 纤维有优先级吗?
纤程被定义为轻量级线程,线程具有优先级,因为它们是抢先调度的。然而,既然光纤是合作的,它们是否也有优先级?
ruby - 纤维#活着?没有定义的
我使用 ruby1.9.2p180(2011-02-18 修订版 30909)i686-linux。Fiber#alive?
返回一个未定义的错误:
其他方法,例如,Fiber#resume
似乎Fiber.yield
工作正常。怎么了?
顺便问一下,Fiber#resume
和 和有什么不一样Fiber#transfer
?
ruby - Sinatra 会话未使用 Rack::FiberPool 保留
请求之间不会保留会话,但我看不出我做错了什么。代码!
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?为什么有票,他会把它踢出鲁比?
ruby - 红宝石线程块?
我在某处读到红宝石线程/纤维即使使用 1.9 也会阻塞 IO。这是真的吗?它的真正含义是什么?如果我在多个线程上执行一些 net/http 操作,那么在给定时间是否只有 1 个线程针对该请求运行?
谢谢
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]
并且还可能检查地址顺序是否一致)。
哦,我强烈不希望诉诸CreateFiber
WinAPI 系列函数。
ruby - 中途戒烟后该怎么办
一旦我在一个 Fiber 实例的中间完成fiber
,即我yield
从它中编辑而没有完成它,并且我不再使用它,fiber
我该怎么处理它?我应该明确地销毁它,还是有类似kill
Fiber 的东西,或者它会被正确地收集起来?如果是,那么 Ruby 怎么知道我fiber.resume
将来会不会去呢?