运行 N 具有并行限制的 Promises
Run N Promises with parallel limitation
所以,我正在尝试 运行 N promises with parallel count limitation。例如,我希望在我的程序运行时有 3 个承诺等待回调。不多,但仍然可能是这样的情况,当 2 个 promises 在工作时(例如 - N = 5, 3 并行,所以在程序结束时只有 2 个 promises,没关系)
如果没有 yield sleep 1
,此代码将不起作用,它将启动 3 个函数添加,记录 3“#{name about to create}”,仅此而已。只要您可以等待,程序就会一直保持这种状态。
但是 yield sleep 1
它工作正常。
为什么?
co = require 'co'
Promise = require "bluebird"
in_progress = 0
check_num = 0
checks_list = []
add = (name) ->
console.log "#{name} about to create"
in_progress++
new Promise (resolve, reject) ->
setTimeout () ->
console.log "#{name} completed"
in_progress--
resolve(name)
, 3000
sleep = (t) ->
new Promise (resolve, reject) ->
setTimeout ->
resolve()
, t
run = () -> co ->
while check_num < 5
console.log "in progress: #{in_progress}"
if in_progress < 3
checks_list.push add("n#{check_num++}")
# yield sleep 1
run().then () ->
console.log checks_list
Promise.all checks_list
.then () ->
console.log checks_list
P.S.This 问题重复 this 但它是俄语。
如果没有 yield
ing,你只会有一个无限循环。 setTimeout
回调永远不会发生,承诺永远不会解决,你的循环计数器也永远不会改变。使用 yield sleep 1
,循环在每次迭代时被中断,允许其他事情发生,这最终将减少 in_progress
并允许创建更多 add
承诺,直到 check_num
5.
请注意,由于您使用的是 Bluebird,因此不需要任何这些,甚至不需要 co
:
Promise = require "bluebird"
add = Promise.coroutine (name) ->
console.log "#{name} about to create"
yield Promise.delay 3000
console.log "#{name} completed"
Promise.map ("n#{check_num}" for check_num in [0..5]),
add,
concurrency: 3
.then ->
console.log "all done"
所以,我正在尝试 运行 N promises with parallel count limitation。例如,我希望在我的程序运行时有 3 个承诺等待回调。不多,但仍然可能是这样的情况,当 2 个 promises 在工作时(例如 - N = 5, 3 并行,所以在程序结束时只有 2 个 promises,没关系)
如果没有 yield sleep 1
,此代码将不起作用,它将启动 3 个函数添加,记录 3“#{name about to create}”,仅此而已。只要您可以等待,程序就会一直保持这种状态。
但是 yield sleep 1
它工作正常。
为什么?
co = require 'co'
Promise = require "bluebird"
in_progress = 0
check_num = 0
checks_list = []
add = (name) ->
console.log "#{name} about to create"
in_progress++
new Promise (resolve, reject) ->
setTimeout () ->
console.log "#{name} completed"
in_progress--
resolve(name)
, 3000
sleep = (t) ->
new Promise (resolve, reject) ->
setTimeout ->
resolve()
, t
run = () -> co ->
while check_num < 5
console.log "in progress: #{in_progress}"
if in_progress < 3
checks_list.push add("n#{check_num++}")
# yield sleep 1
run().then () ->
console.log checks_list
Promise.all checks_list
.then () ->
console.log checks_list
P.S.This 问题重复 this 但它是俄语。
如果没有 yield
ing,你只会有一个无限循环。 setTimeout
回调永远不会发生,承诺永远不会解决,你的循环计数器也永远不会改变。使用 yield sleep 1
,循环在每次迭代时被中断,允许其他事情发生,这最终将减少 in_progress
并允许创建更多 add
承诺,直到 check_num
5.
请注意,由于您使用的是 Bluebird,因此不需要任何这些,甚至不需要 co
:
Promise = require "bluebird"
add = Promise.coroutine (name) ->
console.log "#{name} about to create"
yield Promise.delay 3000
console.log "#{name} completed"
Promise.map ("n#{check_num}" for check_num in [0..5]),
add,
concurrency: 3
.then ->
console.log "all done"