我正在使用async.js'queue
,我不确定是否应该一次处理一项任务。任务本身是一个发送到套接字的简单快速的消息。
process: (task, done) ->
task.client.send(task.model, done)
VS
process: (task, done) ->
task.client.send(task.model)
done()
答案 0 :(得分:3)
正确的答案是“它取决于”。
任务完成后,必须在任务函数内调用done
回调,以通知队列结束。
task.client.send
是异步操作,因此将在不久的将来完成。因此,有一个回调作为第二个参数,调用者可以使用它来知道发送操作何时完成。
如果您在发送请求结束时完成了任务,则应将done
回调传递给task.client.send
,如下所示:
process: (task, done) ->
task.client.send(task.model, done)
如果,对于您而言,任务在发送操作开始时完成,您应该在task.client.send
之后调用它,如下所示:
process: (task, done) ->
task.client.send(task.model)
done()
在这种情况下,可以在发送操作结束之前认为任务已完成。
我在第二种情况下看到的缺点(done
调用后send
调用的那个)是你无法控制send
调用的并发性。 Async.js queue
方法的默认并发级别为1
,因此在第二种情况下,在前一个终止之前执行send
调用。因此,所有send
个请求都可以同时启动,您无法限制它们。
在第一种情况下(done
作为send
的第二个参数),您可以更好地控制send
请求,并可以使用queue
控制并行度第二个论点(concurrency
)。