据我所知,Web worker需要在一个单独的JavaScript文件中编写,并像这样调用:
new Worker('longrunning.js')
Run Code Online (Sandbox Code Playgroud)
我正在使用闭包编译器来组合和缩小我的所有JavaScript源代码,而我宁愿不必将我的worker放在单独的文件中进行分发.有办法做到这一点吗?
new Worker(function() {
//Long-running work here
});
Run Code Online (Sandbox Code Playgroud)
鉴于第一类函数对JavaScript至关重要,为什么执行后台工作的标准方法必须从服务器加载整个'其他JavaScript文件?
我已经开始修补Node.js HTTP服务器,并且非常喜欢编写服务器端Javascript,但有些东西阻止我开始使用Node.js作为我的Web应用程序.
我理解整个异步I/O概念,但我有点担心程序代码非常CPU密集的边缘情况,例如图像处理或排序大数据集.
据我了解,服务器对于简单的网页请求非常快,例如查看用户列表或查看博客帖子.但是,如果我想编写非常CPU密集型代码(例如在管理员后端)生成图形或调整数千个图像的大小,请求将非常慢(几秒钟).由于此代码不是异步的,因此在几秒钟内发送到服务器的每个请求都将被阻止,直到我的慢请求完成为止.
一个建议是使用Web Workers进行CPU密集型任务.但是,我担心网络工作者会很难编写干净的代码,因为它的工作原理是包含一个单独的JS文件.如果CPU密集型代码位于对象的方法中该怎么办?为每个CPU密集型方法编写一个JS文件真是太糟糕了.
另一个建议是生成子进程,但这使得代码更难以维护.
有什么建议可以克服这个(感知的)障碍吗?如何使用Node.js编写干净的面向对象代码,同时确保CPU重任务执行异步?
我在前一段时间偶然发现了node.js并且非常喜欢它.但很快我发现它缺乏执行CPU密集型任务的能力.所以,我开始使用谷歌搜索并得到这些答案来解决问题:纤维,Web工作者和线程(thread-a-gogo).现在使用哪一个是一个混乱,其中一个肯定需要使用 - 毕竟有一个擅长IO的服务器的目的是什么?建议需要!
更新:
我正在想办法离开; 只是需要建议.现在,我想到的是:让我们有一些线程(使用thread_a_gogo或webworkers).现在,当我们需要更多时,我们可以创造更多.但是在创建过程中会有一些限制.(系统没有暗示,但可能是因为开销).现在,当我们超出限制时,我们可以派生一个新节点,并开始在其上创建线程.这样,它可以持续到我们达到某个极限(毕竟,进程也有很大的开销).达到此限制后,我们将开始排队任务.每当一个线程空闲时,它将被分配一个新任务.这样,它可以顺利进行.
所以,这就是我的想法.这个想法好吗?我对所有这些过程和线程都有点新意,所以没有任何专业知识.请分享您的意见.
谢谢.:)
我有一个应用程序,它通过JavaScriptCore在webkit-gtk浏览器中扩展JavaScript.现在我有几个类,我添加到全局上下文,如下所示:
void create_js(gpointer context, char* className, JSClassDefinition clasDefinition) {
JSClassRef classDef = JSClassCreate(&clasDefinition);
JSObjectRef classObj = JSObjectMake(context, classDef, context);
JSObjectRef globalObj = JSContextGetGlobalObject(context);
JSStringRef str = JSStringCreateWithUTF8CString(className);
JSObjectSetProperty(context, globalObj, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(str);
}
Run Code Online (Sandbox Code Playgroud)
现在,我还想将这些类添加到WebWorker的上下文中,因此我可以从JS中实例化的worker中调用它们.
我试过Worker
这样的对象:
JSStringRef workerStr = JSStringCreateWithUTF8CString("Worker");
JSObjectRef worker = JSObjectGetProperty(context, globalObj, workerStr, NULL);
JSObjectSetProperty(context, worker, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(workerStr);
Run Code Online (Sandbox Code Playgroud)
但是这会将它添加到WorkerConstructor
对象中,并且当new Worker()
调用a时,这些类不可用.
我正在开发一个使用Web worker的项目.
在我的脑子部分,我有这个代码:
var worker = new Worker("worker.js");
// More code
Run Code Online (Sandbox Code Playgroud)
这在Safari中运行良好,但Chrome报告以下错误:
Uncaught SecurityError: Failed to create a worker: script at '(path)/worker.js' cannot be accessed from origin 'null'.
为什么这在Safari中完美运行而不是Chrome?我该如何解决?
谢谢.
首先,我创建了一个正则表达式,它将匹配项目中所有头文件列表中的所有唯一外部库路径.我问过一个星期前制作正则表达式的问题.
我开始插手,看看它在异步和变成web工作时的行为方式.为了方便和可靠,我创建了这个在所有三种模式下运行的通用文件:
/** Will call result() callback with every match it founds. Asynchronous unless called
* with interval = -1.
* Javadoc style comment for Arnold Rimmer and other Java programmers:
*
* @param regex regular expression to match in string
* @param string guess what
* @param result callback function that accepts one parameter, string match
* @param done callback on finish, has no parameters
* @param interval delay (not actual interval) between finding matches. …
Run Code Online (Sandbox Code Playgroud) 如何使用从字符串创建Web worker(通过POST请求提供)?
我能想到的一种方法,但我不确定如何实现它,是通过从服务器响应创建数据URI,并将其传递给Worker构造函数,但我听说有些浏览器不允许这,因为相同的原产地政策.
注意:作为Worker构造函数的参数传递的URI必须遵循同源策略.目前,浏览器供应商对数据URI是否来源不一致存在分歧; Gecko 10.0(Firefox 10.0/Thunderbird 10.0)及更高版本确实允许数据URI作为工作人员的有效脚本.其他浏览器可能不同意.
这里还有一篇关于whatwg讨论它的帖子.
服务工作者可以做什么,网络工作者不能?或相反亦然?
Web工作者似乎是服务工作者功能的一个子集.它是否正确?
angularJS如何使用Web worker在后台运行进程?这样做我应该遵循什么模式?
目前,我正在使用一个在单独的Web worker中具有该模型的服务.此服务实现以下方法:
ClientsFacade.calculateDebt(client1); //Just an example..
Run Code Online (Sandbox Code Playgroud)
在实现中,此方法使用数据向worker发送消息.这允许我抽象它在一个单独的线程中执行的事实,我还可以提供一个查询服务器的实现,甚至是在同一个线程中执行此操作的实现.
由于我是javascript的新手,而且我只是从其他平台上回收知识,我想知道这是你要做的事情,还是我正在使用的Angular,提供了一种方法.这也引入了我的架构的变化,因为工作人员必须明确地将更改推送到控制器,然后控制器更新其值,然后这反映在视图中,我是否过度设计了这个?有点令人沮丧的是,网络工作者通过不允许我共享内存等来"保护"我.
web-worker ×10
javascript ×9
node.js ×2
angularjs ×1
concurrency ×1
data-uri ×1
fibers ×1
firefox ×1
html ×1
html5 ×1
regex ×1
w3c ×1
webkit ×1