问题标签 [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 投票
1 回答
454 浏览

c++ - 在 Fiber.detach() 之后执行什么时候?

该程序输出: 在加入之前。加入后。你好,升压::纤维。

为什么不输出:加入前。你好, boost::fiber 加入后。

0 投票
0 回答
48 浏览

node.js - Sailsjs 光纤集成

我试图将 SailsJS 与基于纤维的同步集成。

http://alexeypetrushin.github.io/synchronize/docs/index.html

正如对其他纤程库的评论,我添加了一个自定义中间件来根据请求创建一个新纤程。

中间件正在执行,我可以通过控制台确认。但是当我尝试在我的一个控制器中做任何与纤维相关的事情时,例如 sync.defer() ,我确实得到了一个例外。

error: Error getting xxxxxx Error: no current Fiber, defer can't be used without Fiber!

由于sailsjs 基于express,添加这个中间件就足够了,虽然我不知道我可能会缺少什么。

作为旁注,如果我在控制器方法本身内创建一个纤程,一切都会按预期工作。

谢谢。

0 投票
1 回答
9195 浏览

coroutine - Coroutine vs Fiber 差异说明

在书中Linux System Programming, 2nd Edition,协程和 Fiber 的区别解释如下:

协程和纤程提供了比线程更轻的执行单元(当它们是编程语言构造时,前者是它们的名称,而当它们是系统构造时是后者)。

我有一些 Coroutines(语言结构)的例子,但找不到 Fibers 的例子。

谁能给我一些Fiber(系统构造)的例子?

0 投票
1 回答
715 浏览

c++ - 如何为分段堆栈支持构建 boost 光纤库

我正在尝试构建 boost Fiber 库,我不确定将哪些命令行参数传递给 ./b2。

./b2 --reconfigure cxxflags="-std=c++14" threading=multi variant=release link=shared --toolset=gcc segmented-stacks=on 执行配置检查

构建 Boost C++ 库。

警告:图形库不包含基于 MPI 的并行组件。注意:要启用它们,请添加“使用 mpi ;” 到您的 user-config.jam - zlib:是 - bzip2:否 - iconv (libc):是 - icu:是 - native-atomic-int32-supported:是 - pthread-supports-robust-mutexes:是 - 编译器支持-visibility :是 - compiler-supports-ssse3 :是 - compiler-supports-avx2 :是 - gcc 可见性:是 - long double 支持:是 警告:跳过可选的消息传递接口 (MPI) 库。注意:要启用 MPI 支持,请添加“使用 mpi ;” 到 user-config.jam。注意:要禁止显示此消息,请将“--without-mpi”传递给 bjam。注意:否则,您可以放心地忽略此消息。

组件配置:

0 投票
2 回答
800 浏览

javascript - 错误:没有光纤就无法等待

大家好,在我的流星项目中,我在 Iron Router 的一条路线上有一个回调函数。

问题是当我运行路径 localhost:3000/scraper 时,控制台显示以下消息:错误:没有光纤就无法等待

此代码刮到一页“x”。

如果有人可以帮助我,我将不胜感激。非常感谢大家。

0 投票
1 回答
195 浏览

c++ - 我得到了'boost::fibers::lock_error',但不知道为什么

我运行这段代码

我得到了

它打印的最后一个日志在 _mutex.lock() 之前。如果 t 不是静态变量,则不会抛出任何错误。如果我在主函数中删除 t.flush(),它不会抛出任何错误。使用我在笔记中写的 std::lock_guard ,它旁边的行没有打印出来。我无法弄清楚我尝试过的案例的原因和差异是什么。

我使用 gcc 5.4.0 构建代码,使用 -O0

0 投票
1 回答
776 浏览

c++ - 纤维可以在线程之间迁移吗?

在线程 A 中创建的纤程可以切换到在线程 B 中创建的另一个纤程吗?为了使问题更具体,一些操作系统具有原生实现的光纤(windows 光纤),
其他需要自己实现(在 linux 中使用 setjump longjump 等)。

例如, Libcoro将所有这些都包装在一个 API 中(对于 Windows,它只是原生光纤的包装器,对于 Linux,它自己实现它等等)

那么,如果可以在线程之间迁移光纤,你能给我一个在 c/c++ 中的 windows (linux) 中的用法示例吗?

我在 boost 库文档中发现了一些关于光纤迁移的内容,但它的实现和平台依赖性还不够具体。例如,我仍然想了解如何自己使用 Windows 光纤(或在 linux 上使用 Libcoro)。

如果以一般方式不可能,为什么会这样?

我知道 Fiber 旨在用作在单个线程上协作多任务的轻量级线程,与常规线程相比,它们具有廉价的上下文切换,并且它们简化了编程。一个示例用法是具有多个线程的系统,每个线程都有多个纤程在其父线程上执行某种工作层次结构(从不离开父线程)。

即使这不是预期用途,我仍然想学习如何以一般方式进行操作,因为我认为我可以通过在线程之间迁移纤程来优化工作系统上的工作负载。

0 投票
0 回答
180 浏览

javascript - 如何在没有上下文切换的情况下在光纤中发出 HTTP 请求?

在流星中运行以下(简化的)代码时,我遇到了意外的行为:

输出:

根据它的文档,HTTP.get 是(应该是)同步的。我尝试使用另一个库而不是流星/http,但得到了相同的结果。

当到达 HTTP 请求并在光纤外继续执行时,光纤内的执行似乎停止了。只有在光纤外完成后,它才会返回完成它在光纤内开始的内容。

这是怎么回事?如果没有此上下文切换,如何在光纤中发出 HTTP 请求?

0 投票
1 回答
139 浏览

ruby - 获取红宝石中开放纤维的数量

如何在ruby应用程序中获取当前的开放光纤数量?我的应用程序使用 EventMachine Synchrony 库进行并发处理。在谷歌搜索时,我没有找到任何可以返回它的 API。

例如,如果我有这段代码:

那我怎么知道有多少光纤在运行呢?无需手动使用counter++,当然也无需@some_arr.size.

0 投票
1 回答
1805 浏览

c++ - 分段堆栈如何工作

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

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

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

  2. 他们还说

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

    这是什么意思?他们会重新启动整个 goroutine 吗?这不会导致不确定的行为吗?

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

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