处理NodeJS应用程序中的后台进程有什么好处?
场景:在用户向应用程序发布内容后,我想要处理数据,从外部资源请求其他数据等.所有这些都非常耗时,所以我想要它来自req/res循环.理想的情况是拥有一个可以快速转储作业的作业队列,守护程序或任务运行器将始终使用最旧的作业并对其进行处理.
在RoR中,我会用延迟工作这样做.这个API的Node等价物是什么?
我是Rabbitmq(和编程)的新手,如果这很明显,请提前对不起.我正在创建一个池来共享正在处理队列的线程,但我不确定是否应该在池中使用连接或通道.
我知道我需要通道来完成实际工作,但每个连接有一个通道(从队列中获得更多吞吐量)是否有性能优势?或者我最好只使用每个应用程序的单个连接并汇集多个渠道?
注意:因为我正在汇集资源,初始成本不是一个因素,因为我知道连接比渠道更昂贵.我对吞吐量更感兴趣.
什么TombstonedTaskError意思?在尝试从cron-job向队列中添加任务时会引发它:
Traceback (most recent call last):
File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 501, in __call__
handler.get(*groups)
File "/base/data/home/apps/.../tasks.py", line 132, in get
).add(queue_name = 'userfeedcheck')
File "/base/python_lib/versions/1/google/appengine/api/labs/taskqueue/taskqueue.py", line 495, in add
return Queue(queue_name).add(self)
File "/base/python_lib/versions/1/google/appengine/api/labs/taskqueue/taskqueue.py", line 563, in add
self.__TranslateError(e)
File "/base/python_lib/versions/1/google/appengine/api/labs/taskqueue/taskqueue.py", line 619, in __TranslateError
raise TombstonedTaskError(error.error_detail)
TombstonedTaskError
Run Code Online (Sandbox Code Playgroud)
搜索文档只有以下内容:
Run Code Online (Sandbox Code Playgroud)exception TombstonedTaskError(InvalidTaskError) Task has been tombstoned.
..这不是特别有帮助.
我在App Engine代码中找不到任何有用的东西..
我目前正在尝试在php中实现一个作业队列.然后,队列将作为批处理作业处理,并且应该能够并行处理某些作业.
我已经做了一些研究并找到了几种方法来实现它,但我并没有真正意识到它们的优点和缺点.
例如,通过多次调用脚本来执行并行处理,fsockopen如下所述:
PHP中的简单并行处理
我找到的另一种方法是使用这些curl_multi功能.
curl_multi_exec PHP文档
但我认为这两种方式会增加相当多的开销,在队列上创建批处理应该主要在后台运行吗?
我也读到了关于pcntl_fork这似乎也是一种处理问题的方法.但是如果你真的不知道自己在做什么(就像我现在这样;),那看起来就会变得非常混乱.)
我也看了一下Gearman,但在那里我还需要根据需要动态生成工作线程,而不是只运行一些,然后让gearman作业服务器将它发送给自由工作者.特别是因为线程应该在执行一个作业后干净利落地退出,不会遇到最终的内存泄漏(在该问题中代码可能不完美).
Gearman入门
所以我的问题是,你如何处理PHP中的并行处理?为什么选择你的方法,不同的方法有哪些优点/缺点?
感谢您的任何意见.
注意:此问题也在此处的 Q.js邮件列表中交叉发布.
我遇到了多个异步操作的情况,我接受的答案指出使用诸如q.js之类的库使用Promise会更有益.
我确信重构我的代码以使用Promises但因为代码很长,我已经修剪了不相关的部分并将关键部分导出到一个单独的repo中.
要求是我希望在遍历所有拖放的文件后,pageSizes不为空.
问题是getSizeSettingsFromPage函数中的FileAPI操作导致getSizeSettingsFromPage异步.
所以我不能放置checkWhenReady(); 像这样.
function traverseFiles() {
for (var i=0, l=pages.length; i<l; i++) {
getSizeSettingsFromPage(pages[i], calculateRatio);
}
checkWhenReady(); // this always returns 0.
}
Run Code Online (Sandbox Code Playgroud)
这有效,但并不理想.在完成所有pages已成功完成此函数calculateRatio 之后,我更喜欢将checkWhenReady调用为ONCE .
function calculateRatio(width, height, filename) {
// .... code
pageSizes.add(filename, object);
checkWhenReady(); // this works but it is not ideal. I prefer to call this method AFTER all the `pages` have …Run Code Online (Sandbox Code Playgroud) Google应用引擎任务队列的配置为(示例)
<queue>
<name>mail-queue</name>
<rate>5/m</rate>
<bucket-size>10</bucket-size>
</queue>
Run Code Online (Sandbox Code Playgroud)
在这里,"桶大小"是什么意思?我在谷歌应用引擎文档中找不到关于此的综合文档.
将此值指定为10意味着如果100个任务在一个时刻排队,那么只有10个会被放入队列中而其余的将被忽略吗?
到目前为止,没有人(甚至GAE文档)都没有能够清楚地描述推送队列和拉取队列之间的区别.
我的理解是Task Queue API允许您定义可以将工作排入的任务队列.不知何故,这与GAE的自动缩放功能一起使用,因此您无需显式管理消耗这些队列任务的工作线程数:GAE就是为您完成的.
但是我无处可寻找推送和拉取队列之间差异的"King's English"描述.什么是"推队"推?什么是"拉队列"拉?它们都配置在里面queues.xml吗?
我最近切换到Google App Engine Java SDK 1.7.3.从那时起,每次我将DeferredTasks提交到任务队列时,我的PermGen空间都用完了.
它发生在使用Java 6的MacOSX 10.7.5上
$ java -version
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-11M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)
Run Code Online (Sandbox Code Playgroud)这是我发现问题时堆栈跟踪的一部分.
INFO: Successfully processed ../target/projectName/WEB-INF/queue.xml
Nov 1, 2012 3:04:00 PM com.google.appengine.api.taskqueue.dev.LocalTaskQueue init
INFO: LocalTaskQueue is initialized
Nov 1, 2012 3:04:01 PM org.quartz.simpl.SimpleThreadPool initialize
INFO: Job execution threads will use class loader of thread: 1255545583@qtp-1458850232-0
Nov 1, 2012 3:04:02 PM org.quartz.core.QuartzScheduler <init>
INFO: …Run Code Online (Sandbox Code Playgroud)我正在使用testbed对我的谷歌应用引擎应用进行单元测试,而我的应用使用了一个任务队列.
当我在单元测试期间向任务队列提交任务时,似乎任务在队列中,但任务不会执行.
如何在单元测试期间执行任务?
我一直致力于通过RabbitMQ来完成一些分布式任务.
我花了一些时间试图让Celery做我想做的事情,但却无法让它发挥作用.
然后我尝试使用Pika和刚刚工作的东西,完美无缺,几分钟之内.
使用Pika而不是芹菜,有什么我错过的吗?
task-queue ×10
javascript ×2
python ×2
rabbitmq ×2
api ×1
asynchronous ×1
bucket ×1
callback ×1
celery ×1
java ×1
memory-leaks ×1
node.js ×1
permgen ×1
php ×1
pika ×1
queue ×1
unit-testing ×1