问题标签 [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 回答
1888 浏览

ubuntu - 错误 npm install fiber@1.0.1 Ubuntu 12.04.4 x64

当我尝试部署我的流星应用程序时

我收到以下错误

当我尝试使用流星网站上所述的命令安装光纤模块时

我收到以下错误

接着

该怎么办?

谢谢!

0 投票
2 回答
2226 浏览

c - 交换到 ucontext_t 的 uc_link 时 swapcontext 段错误

我正在使用通常的 makecontext/swapcontext 例程在 C 中编写一个小型的概念验证纤维库,但这给我带来了一些麻烦(我的平台是 OSX 10.9 Mavericks,使用clang-503.0.40)。

这是我正在处理的数据结构:

这是迷你库(三个函数,fiber_initfiber_runfiber_yield

不过,似乎在纤程中调用 fiber_yield() 并没有正确地将上下文与调用者的上下文交换(其引用存储在纤程上下文的 uc_link 中,请参见current_fiber->context.uc_link内部fiber_yield

运行该程序的痕迹:

产生输出:

我读过 OSX 有堆栈对齐限制(到 16 字节边界),但我malloc用来分配堆栈,它返回一个与 16 字节边界对齐的块(或者我已经读过)。也就是说,似乎重新排列声明的顺序有时会导致段错误不会发生,但它非常虚假且难以重现。

在调用 swapcontext 之前检查fiber_yield显示current_fiber->context堆栈大小非常大;比它应该的要大得多。也许这是腐败的迹象:

任何线索可能会发生什么?谢谢!

0 投票
1 回答
2029 浏览

ruby-on-rails - 光纤局部变量与线程局部变量

我对何时在 Rails 中使用纤维局部变量而不是线程局部变量感到非常困惑。我的用例如下:
我在 rails 中有一个控制器,它在 GET 请求上进行一些计算并将结果(这是一个整数列表)存储在光纤或线程局部变量中。我需要这样做,以便我可以超出这个计算结果,让我们说一个可能由控制器创建的模型。现在我不想将它存储在会话中,因为必须为每个 GET 请求完成此计算。我还在控制器中的 GET 方法完成之前清除了光纤/线程局部变量。

现在我确实看到 Fiber 和 Thread 完全不同,因此它们的存储变量也不同。谁能解释一下何时使用哪种变量?

实际上我的理解如下:似乎永远不能同时在同一个光纤/线程中提供两个请求。因此,如果我有一个想要放入请求范围的值,那么任何一个都可以。我的解释正确吗?

0 投票
2 回答
347 浏览

javascript - Meteor 0.9.1.1 - 从 json 端点填充到服务器端集合

我正在编写一个包作为我正在处理的一个小型应用程序的一部分,我需要做的一件事是从端点获取 json 数据并将其填充到服务器端集合。

我一直收到错误消息,告诉我需要将服务器端集合更新函数放入 Fiber、Meteor.bindEnvironment 或 Meteor._callAsync。

我很困惑,因为没有清晰简洁的解释告诉我这些到底是做什么的,它们是什么,是否以及何时被弃用,或者它们的使用是否是好的做法。

这是我的包文件中重要的内容

一些伪代码:

1) 设置 Mongo.Collection 项目列表

2) 使用我编写的名为 httpFetch() 的函数填充这些,并为每个集合运行它,如果获取成功,则返回已解决的承诺。

3) 在下划线 each() 循环中调用此 httpFetch 函数,遍历我拥有的每个集合,获取 json 数据,并尝试将其插入服务器端 Mongo DB。

Collections.js 如下所示。将插入函数包装在 Fiber 中似乎可以抑制错误消息,但没有数据被插入到数据库中。

* 服务器端组件向远程 * 端点发出请求以填充服务器端 Mongo 集合。* * @class 服务器 * @static */ 服务器 = {

};

我仍然真的被困在这个问题上,从我之前阅读其他帖子的尝试来看,我似乎仍然无法弄清楚让这个工作或让它工作的“最佳实践”方式。

2011/2012 年有很多建议,但我不愿意使用它们,因为 Meteor 不断变化,即使是一个小的更新也会破坏很多东西。

谢谢

0 投票
1 回答
204 浏览

asynchronous - 如何在 Meteor 中使用 wrapAsync

我无法弄清楚如何使用 Meteor 正确使用 wrapAsync。我目前正在使用 node-apac 和亚马逊产品广告 API。

如果我试图运行以下代码,我该如何异步运行它:

我尝试观看多个视频,但遇到了问题

0 投票
1 回答
620 浏览

node.js - 部署到 Heroku 时不推荐使用 Meteor Fiber

我正在使用我曾经可以工作的buildpack将我的 Meteor 应用程序部署到 Heroku 。我有很短的时间没有进行任何部署,今天我这样做有问题。安装 NPM 依赖项时出现错误。它说纤维有问题。这是日志:

你有过这样的问题吗?你知道为什么会这样吗?

0 投票
1 回答
2258 浏览

java - Quasar 的光纤中的阻塞 IO 是否会阻塞其线程池中的线程?

据我所知,在Akka中,所有参与者都安排在一个线程池上。太多actor同时执行阻塞IO,每个阻塞调用阻塞一个线程,导致线程中断。

现在我正在研究 JVM 上的一个有趣的光纤实现——Quasar,它允许大量用户线程——光纤——并使用线程池来调度它们。但是,我想知道当许多纤程调用遗留阻塞 API 时是否有好处。

我不认为这会有所帮助,因为阻塞 API 仍然会阻塞系统线程,并且 Quasar 无法神奇地将其转换为仅阻塞光纤。这只是我的猜测,如果我错了,请纠正我。

0 投票
1 回答
557 浏览

node.js - 自托管 Meteor App 光纤问题

早上好

最近几天我遇到了这个问题,我对缺乏支持/文档​​感到非常沮丧。我的错误如下:

/usr/share/nginx/html/bundle/programs/server/node_modules/fibers/future.js:245 throw(ex); ^ 错误:模块没有自行注册。在 Module.load (module.js:355:32) 在 Function.Module._load (module.js:310:12) 在 Module.require (module.js:365:17) 在 require (module .js:384:17) 在 Object.Npm.require (/usr/share/nginx/html/bundle/programs/server/boot.js:142:18) 在 packages/npm-node-aes-gcm/wrapper。 js:2:1 在 /usr/share/nginx/html/bundle/programs/server/packages/npm-node-aes-gcm.js:33:4 在 /usr/share/nginx/html/bundle/programs/ server/packages/npm-node-aes-gcm.js:42:3 at /usr/share/nginx/html/bundle/programs/server/boot.js:222:10 错误:永远检测到脚本退出代码:1

纤维 -v 1.0.5 节点 -v 0.12.4 流星 -v 1.1.0.2

任何帮助表示赞赏

0 投票
1 回答
778 浏览

c++ - 在 Windows、TIB 和异常上修改堆栈

我的问题的起源实际上源于希望在 Windows 上提供支持用户提供堆栈的 pthread 实现。具体来说,pthread_attr_setstack应该做一些有意义的事情。我的实际要求比这更复杂,但这对于帖子的目的来说已经足够了。

在 Fiber 或 Thread API 中没有用于提供堆栈的公共 Win API。我四处寻找偷偷摸摸的后门、变通方法和黑客,没有任何进展。事实上,我查看了 winpthread 的灵感来源,并忽略了提供给pthread_attr_setstack.

相反,我尝试了以下“解决方案”,看看它是否可行。我使用和ConvertThreadToFiber的通常组合创建了一个 Fiber 。在我提供了一个最小的堆栈大小。然后在光纤的入口点为堆栈分配内存,适当更改 TIB 字段:“堆栈基础”和“堆栈限制”(参见此处:http ://en.wikipedia.org/wiki/Win32_Thread_Information_Block ),然后将 ESP 设置为我的堆栈的高地址。CreateFiberExSwitchToFiberCreateFiberEx

(在现实世界的情况下,我会比这更好地设置堆栈并更改 EIP,以便此步骤的行为更像 posix 函数swapcontext,但你明白了)。

如果我在这个不同的堆栈上进行任何操作系统调用,那我就完蛋了(printf例如死了)。不过这对我来说不是问题。我可以确保在我的自定义堆栈上时我永远不会确保调用(因此我说我的实际需求涉及更多)。除了...我需要例外才能工作。他们没有!具体来说,如果我尝试在修改后的堆栈上抛出并捕获异常,那么我会得到一个断言

0xXXXXXXXX 处未处理的异常 ....

所以我的(含糊的)问题是,有没有人知道异常和自定义堆栈如何不能很好地结合在一起?我很欣赏这是完全不受支持的,并且可以很高兴地除了零响应或“走开”。事实上,我几乎已经决定我需要一个不同的解决方案,尽管这涉及到妥协,但我很可能会使用一个。但是,好奇心使我变得更好,所以我想知道为什么这不起作用。

在相关的说明中,我想知道 Cygwin 如何为 ucontext 处理这个问题。这里的源码http://szupervigyor.ddsi.hu/source/in/openjdk-6-6b18-1.8.13/cacao-0.99.4/src/vm/jit/i386/cygwin/ucontext.c使用GetThreadContext/SetThreadContext来实现上下文。但是,从实验中我看到,当从新上下文中抛出异常时,这也会失败。事实上,该SetThreadContext调用甚至不会更新 TIB 块!

编辑(基于@avakar 的回答)

以下代码与您的代码非常相似,演示了同样的失败。不同之处在于我没有启动第二个挂起的线程,而是将其挂起然后尝试更改上下文。当 try-catch 块被命中时,此代码显示了我所描述的错误foo。也许这根本不合法。值得注意的是,在这种情况下ExceptionList,TIB 的成员在被调用时是一个有效的指针modifyThreadContext,而在您的示例中它是-1。手动编辑它没有帮助。

正如我对您的回答的评论中提到的那样。这不正是我所需要的。我想从我当前所在的线程切换上下文。但是,文档SetThreadContext警告不要在活动线程上调用它。所以我猜如果下面的代码不起作用,那么我就没有机会让它在单个线程上工作。

0 投票
1 回答
40 浏览

node.js - 在 node.js 中使用纤维的潜在问题是什么?

我打算在 node.js 中尝试使用纤维?我应该考虑哪些潜在问题?看起来纤维与简单的事件循环和 node.js 的单线程设计的良好设计完全相反。