【问题标题】:How to handle massive computation on websites? Web workers or CGI?如何处理网站上的海量计算?网络工作者还是 CGI?
【发布时间】:2012-04-03 06:41:43
【问题描述】:

我编写了一个基于 JavaScript 的网站,可以输入、编辑和解决 Nonograms。您可能知道,求解非图是一个 NP 完全问题。

我的第一次尝试是纯(单线程)JavaScript。但是在更大的 nonograms 上,Chrome 显示了它的 BSOD 并在几分钟后终止了 JS 脚本。下一次尝试是使用Web Workers。我拆分了求解算法,以便每个工作人员获得一行/列来求解并返回结果。这是一个改进,它能够解决中等大小的非图。但是,有时浏览器会在一段时间后杀死显示 BSOD 的 JS VM,而且网站并没有像我预期的那样真正响应,因为这就是 Web Workers 的用途,不是吗?

只是为了“好玩”,我将求解算法移植到 Python,并使用 ajax 请求调用 Python 脚本而不是 Web Workers。有趣的是,它甚至比 JavaScript 还要慢,但经过一段时间的计算,请求返回了 500 Internal Server Error。我相信这是由于 CGI 脚本的最大执行时间在 PHP afaik 上为 30 秒。

CGI 想法并不是最好的,因为当多个用户想要解决一个 nonogram 时,服务器运行在 100% 的 CPU 上,所以我可能坚持使用客户端计算。

所以问题是,进行此计算的最佳方法是什么(对于较大的非图可能需要 10 分钟)?我认为只要网站保持响应并且浏览器不终止执行任务,执行时间就不是问题。

同时,我也在尝试优化递归算法......

谢谢!

【问题讨论】:

    标签: javascript cgi web-worker computation


    【解决方案1】:

    也许您可以在向WebWorkers 发布消息之前添加一些延迟。如果将流程拆分为足够小的功能,则可以保持页面响应,但需要更长的时间才能解决。

    【讨论】:

    • 我已经做到了。我正在使用显示浏览器当前正在解决的 gif。我正在使用 jQuery 显示/隐藏。但是当我立即启动工人时,它并没有出现。所以我引入了 2 秒的延迟。但是一旦工作人员开始计算并且 chrome 进程在 100% CPU 上运行,网站就会停止响应。
    • @ebeb 你确定它旁边没有什么东西一直在运行吗?在给出更明确的答案之前,我们可能需要查看一些代码。
    • 是的,我敢肯定,因为一旦我将 Worker postMessage 调用替换为 ajax 调用以使用 python 版本,页面就会响应。我尝试组装一个简短的例子来说明这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2011-01-20
    • 2014-01-14
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多