【问题标题】:Async.js queue worker not finishingAsync.js 队列工作者未完成
【发布时间】:2016-07-28 01:03:18
【问题描述】:

使用以下代码建立使用 robocopy 执行复制操作的作业队列:

interface copyProcessReturn {
    jobId: number,
    code: number,
    description: string,
    params: string[],
    source: string,
    target: string,
    jobsLeft: number
}

export default class CopyHandler {
 private aQueue: AsyncQueue<copyProcess>;

 constructor() {
    let that = this;
    this.aQueue = async.queue(function (cp: copyProcess) {
        that.performCopy(cp);
        that.copy_complete();
    }, 1);     
 }

 private copy_complete() {
     // NOP
 }  

 public addCopyProcess(cp: copyProcess): void {
    this.aQueue.push(cp);
 }

其目的是允许一次执行一个复制进程,同时在向队列中添加额外的复制进程方面保持并发性。

这适用于第一个作业,并且其他作业可以正确排队。但是,即使在作业完成后正确调用了 copy_complete() 回调,它的工作人员也不会被释放,并且队列中的其他作业仍然未处理。

非常感谢您的提示。

【问题讨论】:

  • async.queue 中的函数有 2 个参数,第二个是您需要在此之后调用的回调。copy_complete();让异步库知道它已经完成并且可以在队列中运行下一个 fn
  • 谢谢,async.worker 现在按预期完成。如果您将评论作为答案发表,我会将其标记为正确。
  • 酷,我会的,我正在打电话,所以更容易发表评论。谢谢

标签: javascript node.js multithreading typescript async.js


【解决方案1】:

async.queue 中的函数有 2 个参数,第二个是回调函数,您需要在 that.copy_complete(); 之后调用它以让异步库知道它已经完成并且可以在队列中运行下一个 fn。比如:

this.aQueue = async.queue(function (cp, next) {
    that.performCopy(cp);
    that.copy_complete();
    next();
}, 1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2016-11-21
    • 2015-01-26
    • 2022-10-20
    • 1970-01-01
    • 2011-12-28
    相关资源
    最近更新 更多