问题标签 [fibers]

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 投票
1 回答
1842 浏览

performance - 纤维在 D 中的线程

我正在试验 D 中的线程和光纤,我想知道是否可以在主线程运行时在不同的 CPU 上运行光纤。如果不是这种情况,那么使用 Fibers over Threads 的原因是什么。(非常欢迎实际例子)

我尝试用 Fibers 编写一些初始程序,一段时间后我切换到下一个 Fiber。但是我注意到 cpu 使用率只停留在一个 cpu 上。

D 的文档指出:

请注意,没有要求将纤维绑定到一个特定线程。相反,只要它们当前没有执行,纤维就可以在线程之间自由传递。

这是否意味着如果我希望它使用不同的 CPU,我必须为光纤提供一个线程来运行?如果是这种情况,那么我看不到目的。

提前致谢!

0 投票
5 回答
10631 浏览

ruby - 如何使用 Ruby(和 open-uri)并行处理数组中的项目

我想知道如何使用 open-uri 打开多个并发连接?我认为我需要以某种方式使用线程或纤维,但我不确定。

示例代码:

0 投票
3 回答
2796 浏览

c# - 在 CLR 中使用托管线程和纤程

好的,下面的链接有一个警告,说明讨论使用了不受支持和未记录的 api。好吧,我正在尝试以任何方式使用代码示例。它主要工作。关于以下与例外有关的具体问题的任何想法?

http://msdn.microsoft.com/en-us/magazine/cc164086.aspx

仅供参考,我对原始样本进行了改进。它正在维护一个指向“previousfiber”的指针。相反,下面的更新示例使用了一个“mainfiber”指针,该指针被传递给每个光纤类。这样,它们总是屈服于主纤维。这允许主纤程处理所有其他纤程的调度。其他纤维总是“屈服”回主要纤维。

发布此问题的原因与在光纤中抛出异常有关。根据文章,通过使用带有 CreateLogicalThreadState()、SwitchOutLogicalThreadState() 等的 CorBindToRunTime API,框架将为每个纤程创建一个托管线程并正确处理异常。

但是,在包含的代码示例中,它有一个 UUnit 测试,该测试尝试在 Fiber 中抛出托管异常并在同一 Fiber 中捕获它。那种柔软的作品。但是在通过记录消息处理它之后,堆栈似乎处于错误状态,因为如果纤程调用任何其他方法甚至是空方法,整个应用程序都会崩溃。

这对我来说意味着 SwitchOutLogicalThreadState() 和 SwitchInLogicalThreadState() 可能没有被正确使用,或者他们可能没有做他们的工作。

注意:问题的一个线索是托管代码注销了 Thread.CurrentThread.ManagedThreadId 并且每个光纤都相同。这表明 CreateLogicalThreadState() 方法并没有像宣传的那样真正创建新的托管线程。

为了更好地分析这一点,我制作了一个伪代码列表,列出了调用来处理纤程的低级 API 的顺序。请记住,纤程都在同一个线程上运行,因此不会同时发生任何事情,这是一个线性逻辑。必要的技巧当然是保存和恢复堆栈。这就是它似乎遇到麻烦的地方。

它开始只是一个线程,然后它转换为纤维:

  1. ConvertThreadToFiber(objptr);
  2. CreateFiber() // 创建几个 win32 光纤。

现在第一次调用一个纤程,它的启动方法是这样的:

  1. corhost->SwitchOutLogicalThreadState(&cookie); 主 cookie 保存在堆栈中。
  2. SwitchToFiber(); // 第一次调用光纤启动方法
  3. corhost->CreateLogicalThreadState();
  4. 运行主要的纤维抽象方法。

最终,纤维需要屈服于主纤维:

  1. corhost->SwitchOutLogicalThreadState(&cookie);
  2. SwitchToFiber(光纤);
  3. corhost->SwitchInLogicalThreadState(&cookie); // 主要的纤维饼干,对吧?

主纤维也将恢复先前存在的纤维:

  1. corhost->SwitchOutLogicalThreadState(&cookie);
  2. SwitchToFiber(光纤);
  3. corhost->SwitchInLogicalThreadState(&cookie); // 主要的纤维饼干,对吧?

以下是为托管代码包装了 fiber api 的 fiber.cpp。

上面的fibers.cpp类文件是Visaul c++项目中唯一的类。它使用 /CLR:oldstyle 开关构建为具有 CLR 支持的 DLL。

上面的单元测试给出以下输出,然后严重崩溃:

0 投票
1 回答
885 浏览

ruby - Em-synchrony 示例代码未按预期工作

em-synchrony 文档链接到本文,这意味着此代码与光纤:

...等效于使用 em-synchrony 的更简单的代码:

但是,运行两者会产生不同的结果。在第一个中,纤维产生直到 HTML 响应返回,而第二个似乎立即打印而不等待响应,因此打印的响应为空。我是误读还是打错了,还是文章实际上暗示了错误的事情?

0 投票
2 回答
20205 浏览

ruby - 为什么我们需要纤维

对于 Fibers,我们有经典的例子:生成斐波那契数

为什么我们在这里需要纤维?我可以用相同的 Proc 重写它(实际上是关闭)

所以

将返回相同的结果。

那么纤维有哪些优点呢。我可以用 Fibers 写哪些我不能用 lambdas 和其他很酷的 Ruby 功能写的东西?

0 投票
1 回答
759 浏览

ruby - Ruby Fibers 和 faye

我有 EventMachine、Fibers 和 faye 的简单脚本

event_1 首先出现,event_2 在它旁边(非常小
的间隔)当我运行它并触发事件时。我总是有这个输出:

就这样。
事件 1 结束在哪里?
我做错了什么?

UPD:如果我删除异步删除require 'redis/connection/synchrony'所有工作都很好。但我需要这个异步。

ruby-1.9.2-p290 [x86_64]

0 投票
1 回答
285 浏览

ruby - 中途戒烟后该怎么办

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

0 投票
7 回答
41698 浏览

multithreading - 哪个更适合 node.js 上的并发任务?纤维?网络工作者?或线程?

前段时间我偶然发现了 node.js 并且非常喜欢它。但很快我发现它严重缺乏执行 CPU 密集型任务的能力。所以,我开始在谷歌上搜索并得到这些答案来解决这个问题:Fibers, Webworkers and Threads (thread-a-gogo)。现在使用哪一个是一个混乱,其中一个肯定需要使用 - 毕竟拥有一个只擅长 IO 而没有别的服务器的目的是什么?需要的建议!

更新:

我在想办法迟到;只是需要建议。现在,我想到的是:让我们有一些线程(使用 thread_a_gogo 或 webworkers)。现在,当我们需要更多它们时,我们可以创造更多。但是创建过程会有一些限制。(系统没有暗示,但可能是因为开销)。现在,当我们超过限制时,我们可以分叉一个新节点,并开始在其上创建线程。这样,它可以一直持续到我们达到某个限制(毕竟,进程也有很大的开销)。当达到这个限制时,我们开始排队任务。每当一个线程空闲时,它就会被分配一个新任务。这样,它就可以顺利进行。

所以,我就是这么想的。这个主意好吗?我对所有这些进程和线程的东西有点陌生,所以没有任何专业知识。请分享您的意见。

谢谢。:)

0 投票
1 回答
2677 浏览

node.js - nodejs中实现CPU绑定任务的方法

我正在将 nodejs 用于 Web 服务器,它解码 GET 参数并以某种编码格式返回数据。解码/编码是使用 nodejs 的 crypto 模块完成的,这似乎是同步的。虽然服务单个请求所花费的时间足够快,但阻塞事件循环使服务在并发性方面表现不佳。

我的要求很简单,在事件循环之外进行编码/解码功能。

  1. 独立进程(child_process 或集群)

这可以是仅用于此目的的单独进程,但由于编码/解码将在子进程中阻塞,这将阻止子进程接收新消息,即永远不会出现将两个字符串编码为子进程的情况也将是单线程的。

  1. 每个请求的单独线程(threads-a-gogo 或 Fiber 或 node-webworker)

为每个请求创建一个单独的线程来执行编码/解码操作,但似乎没有一个模块按预期工作,即threads-a-gogo没有通过npm安装,fiber没有在运行时创建一个单独的线程(), node-webworker不工作

是否有人遇到过类似的问题,或者是否有某种方法可以通过简单的消息传递轻松地在 nodejs 中创建线程。

0 投票
1 回答
421 浏览

rspec - 当在一个 RSpec 套件中调用多个 with_api() 测试时,Goliath 会破坏 em-synchrony/em-hiredis

我只是在使用 RSpec 测试 Goliath API 时遇到了奇怪的行为。我的一项测试如下所示:

API 基本上只是借助以下方式在 redis 中查找密钥em-synchrony/em-hiredis

两个测试单独运行,但不能一起运行。第一个执行后,整个系统会停顿大约 10 秒。然后调用第二个 with_api 但从未执行 get_request - 我认为它正在以某种超时运行。

我在另一个非常相似的测试中发现了相同的行为,该测试正在推送和弹出这样的队列:

second 的内容async do ..也根本不执行。在没有加载 goliath 的情况下,一个非常相似的测试可以完美运行:

前面async do ..的任务是相同的 RSpec 助手。

我整天都在疯狂地寻找,但对我来说这没有任何意义。因为最后一个测试运行得很好,我想它既不是em-synchrony也不是em-synchrony/em-hiredis

也许歌利亚并没有停止,占领新兴市场的时间有点太长了?

感谢您的帮助,这让我发疯了!