gpt4 book ai didi

javascript - 处理 meteor 中的长服务器端计算

转载 作者:搜寻专家 更新时间:2023-11-01 00:40:39 24 4
gpt4 key购买 nike

我在 meteor JS 中使用 jimp ( https://www.npmjs.com/package/jimp ) 来生成图像服务器端。换句话说,我正在使用递归算法“计算”图像的像素。该算法需要相当长的时间才能完成。

我遇到的问题是这似乎完全阻止了 meteor 服务器。在生成图像时尝试访问网页的用户被迫等待。因此,该网站根本不会呈现。

有没有什么(meteor)方法可以在线程或其他东西中运行繁重的递归算法,这样它就不会阻塞整个网站?

最佳答案

Node (以及随后的 meteor )在单个进程中运行,该进程会阻塞 CPU 事件。简而言之,当您受 IO 限制时,node 工作得非常好,但是一旦您执行任何受计算限制的操作,您就需要另一种方法。

正如上面评论中所建议的,您需要将这种 CPU 密集型事件卸载到另一个进程,该进程可以位于同一台服务器(如果您有多个内核)或不同的服务器上。

我们在 Edthena 遇到了类似的问题,我们需要对视频文件的一个子集进行转码。现在我决定使用基于 meteor 的解决方案,因为它很容易设置。这是我们所做的:

  1. 当需要进行新的转码作业时,我们会在数据库中插入一个“视频作业”文档。

  2. 在一个单独的服务器上(我们在转码时用尽了全部 CPU),我们有一个调用 observe 的应用程序像这样:

Meteor.startup(function () {
// Listen for non-failed transcode jobs in creation order. Use a limit of 1 to
// prevent multiple jobs of this type from running concurrently.
var selector = {
type: 'transcode',
state: { $ne: 'failed' },
};
var options = {
sort: { createdAt: 1 }, limit: 1,
};
VideoJobs.find(selector, options).observe({
added: function (videoJob) {
transcode(videoJob);
}, });
});

正如评论所指出的,这只允许一次调用一个作业,这可能是您想要的,也可能不是您想要的。这有进一步的限制,您只能在一个应用程序实例上运行它(调用 observe 的多个实例将同时完成这项工作)。所以这是一个非常简单的作业队列,但它可能会为您的目的工作一段时间。

随着规模的扩大,您可以使用更强大的机制来出队和处理任务,例如亚马逊的 sqs。服务。您还可以探索其他基于 meteor 的解决方案,例如 job-collection .

关于javascript - 处理 meteor 中的长服务器端计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35706776/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com