2015-02-19 2 views
0

Я использую метод очереди async для очереди задач. Я установил параллелизм на 20. У меня осталось чуть более 2100 задач, но когда очередь достигает 20, она перестает обрабатывать больше задач. Вот что у меня есть:Node.js - async.queue() - Как завершить задачу, чтобы позволить больше запускать?

syncrequest = require('sync-request'); 

o.getObj = function(site, link){ 
    global.task.comment(site, 'Pulling page ' + link, function(){}); 
    try{ 
     q.push({url: link}, function(){ 
      console.log("processed" + link); 
     }); 
    }catch(e){ 
     console.log(e); 
    } 
} 

var q = async.queue(function(task, callback){ 
     var body = syncrequest('GET', base+'/'+task.url).getBody(); 
     $$$ = cheerio.load(body); 
     var obj = { 
      title: $$$('#title').text(), 
      link: task.url, 
     }; 
     $$$ = null; 
     objs.push(obj); 
     return; 
},20); 

Обратный вызов console.log("processed" + link); никогда не получает называется, поэтому я предполагаю, что он думает, что задача по-прежнему работает. Я протоколирование общее количество объектов и количество объектов, толкнул на setInterval и журналы:

app-0 (out): 2210 ... 3 
app-0 (out): 2210 ... 6 
app-0 (out): 2210 ... 9 
app-0 (out): 2210 ... 12 
app-0 (out): 2210 ... 15 
app-0 (out): 2210 ... 18 
app-0 (out): 2210 ... 20 
app-0 (out): 2210 ... 20 
app-0 (out): 2210 ... 20 
app-0 (out): 2210 ... 20 
... 

Должен ли я делать что-то, чтобы официально завершить задачу, чтобы очистить место для другого?

+1

Ну, ваши задачи никогда не называют 'callback' ?! – Bergi

+0

@ Bergi Ах, черт возьми. Значит, ты прав! – Jordan

+0

На самом деле ваши задачи не выглядят очень асинхронными. Почему вы используете 'async' вообще вместо цикла' for'? – Bergi

ответ

2

Вы должны вызвать обратный вызов()

var q = async.queue(function(task, callback){ 
     var body = syncrequest('GET', base+'/'+task.url).getBody(); 
     $$$ = cheerio.load(body); 
     var obj = { 
      title: $$$('#title').text(), 
      link: task.url, 
     }; 
     $$$ = null; 
     objs.push(obj); 
     return callback(); 
},20); 
Смежные вопросы