2017-02-20 3 views
2

Это меня озадачило ... Этот следующий тест показывает, что запросы принимаются асинхронно, асинхронно реагирует, но все запросы сначала принимаются, а затем откликаются на ... Учитывая следующие 3 файла:Является ли маршрутизация express.router() синхронным?

package. JSON

{ 
    "name": "express-router-sync-test", 
    "version": "1.0.0", 
    "description": "Testing if express router has sync aspect", 
    "scripts": { 
     "start": "node server.js" 
    }, 
    "dependencies": { 
     "body-parser": "1.16.0", 
     "express": "4.14.1", 
     "request": "2.79.0" 
    } 
} 

server.js

const express = require('express'); 
const bodyParser = require('body-parser'); 
const router = express.Router(); 
const request = require('request'); 

// Create our Express application 
let app = express(); 

let port = 1111; 

// body parser 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 

app.use(router); 

// Start the server 
app.listen(port); 
console.log('Server listening on port ' + port + '.'); 


router.get('/', _get); 
router.post('/test', _test); 

function _test(req, res) { 
    console.log('starting to process request # ', req.body.requestNumber); 
    request({ 
     method: 'GET', 
     url: 'http://localhost:1111' 
    }, (err, response, body) => { 
     console.log('process # ' + req.body.requestNumber + ' has ended'); 
    }); 
} 

function _get(req, res) { 
    res.json({ success: true }); 
} 

test.js

const request = require('request'); 

let i; 
let len = 500; 
let options = { 
    method: 'POST', 
    url: 'http://localhost:1111/test' 
} 

for (i = 0; i < len; i++) { 
    options.form = { requestNumber: i + 1 }; 
    request(options, (err, response, body) => { 
     if (err) console.log(err); 
     if (response) console.log(body) 
    }); 
} 

Учитывая реж структуру:

app/ 
--package.json 
--server.js 
--test.js 

Выполните следующие действия, чтобы воспроизвести тест:

  • в терминале, перейдите к приложению каталог и запустить npm install
  • запустить node server.js
  • открыть другой терминал, перейти на адрес приложения и запустить node test.js

Если вы посмотрите на вывод сервера server.js, вы заметите, что все «начальные процессы» сгруппированы вместе, но в асинхронном порядке. Вы также заметите, что все «завершенные процессом» записи группируются вместе, но также в асинхронном порядке.

теперь я задать два вопроса:

  • Почему не ответы откладывается до тех пор, после того, как все запросы были получены?
  • Это происходит, потому что я наводняю себя запросами?

Любая информация была бы принята с благодарностью.

EDIT: вот пример журнала этого тестового прогона с 50 запросами вместо 500. Вы заметите, что на запрос не отправляется запрос до тех пор, пока все запросы не будут получены. Чем больше запросов вы отправляете, тем дольше вы ожидаете первого ответа.

starting to process request # 1 
starting to process request # 2 
starting to process request # 3 
starting to process request # 4 
starting to process request # 5 
starting to process request # 6 
starting to process request # 9 
starting to process request # 8 
starting to process request # 7 
starting to process request # 10 
starting to process request # 12 
starting to process request # 11 
starting to process request # 13 
starting to process request # 17 
starting to process request # 16 
starting to process request # 15 
starting to process request # 14 
starting to process request # 21 
starting to process request # 19 
starting to process request # 20 
starting to process request # 18 
starting to process request # 22 
starting to process request # 23 
starting to process request # 25 
starting to process request # 24 
starting to process request # 27 
starting to process request # 28 
starting to process request # 26 
starting to process request # 32 
starting to process request # 31 
starting to process request # 30 
starting to process request # 29 
starting to process request # 36 
starting to process request # 35 
starting to process request # 33 
starting to process request # 34 
starting to process request # 40 
starting to process request # 38 
starting to process request # 39 
starting to process request # 37 
starting to process request # 44 
starting to process request # 42 
starting to process request # 43 
starting to process request # 41 
starting to process request # 45 
starting to process request # 46 
starting to process request # 47 
starting to process request # 49 
starting to process request # 48 
starting to process request # 50 
process # 1 has ended 
process # 2 has ended 
process # 4 has ended 
process # 3 has ended 
process # 5 has ended 
process # 6 has ended 
process # 9 has ended 
process # 8 has ended 
process # 11 has ended 
process # 12 has ended 
process # 10 has ended 
process # 7 has ended 
process # 13 has ended 
process # 17 has ended 
process # 15 has ended 
process # 16 has ended 
process # 14 has ended 
process # 21 has ended 
process # 22 has ended 
process # 18 has ended 
process # 20 has ended 
process # 19 has ended 
process # 27 has ended 
process # 24 has ended 
process # 25 has ended 
process # 23 has ended 
process # 31 has ended 
process # 32 has ended 
process # 26 has ended 
process # 28 has ended 
process # 30 has ended 
process # 29 has ended 
process # 34 has ended 
process # 35 has ended 
process # 33 has ended 
process # 36 has ended 
process # 40 has ended 
process # 38 has ended 
process # 39 has ended 
process # 37 has ended 
process # 44 has ended 
process # 42 has ended 
process # 46 has ended 
process # 45 has ended 
process # 41 has ended 
process # 43 has ended 
process # 47 has ended 
process # 50 has ended 
process # 48 has ended 
process # 49 has ended 
+0

Пожалуйста, покажите вывод консоли, который вы получили, и ожидаемый результат, чтобы мы могли понять, что вас удивляет. – jfriend00

+0

Вопрос кажется неопределенным. –

ответ

0

Для тех, кто сталкивается с этим поведением и считает любопытным ... Это происходит потому, что запросы поступают так быстро, что NodeJS «застревает» на фазе опроса Event Loop.

Ниже приведена документация NodeJS, относящаяся к Event Loop and the Polling phase.

Существенной информация в ссылке: «Если очередь опроса не является пустой, то цикл событий будет перебирать его очередь обратных вызовов выполнение им синхронно пока либо очереди не были исчерпаны, или системы в зависимости от достигается жесткий предел ».

0

Это следующий тест показывает, что запросы поступают асинхронно, откликнувшихся на асинхронно, пока все запросы первых получил, а затем ответил на ...

Это не ясно, что это сюрприз Вот. Что запросы сначала принимаются, а затем откликаются? Было бы нецелесообразно отвечать на запрос до его получения.

Поскольку это очень общий вопрос, возможно, я добавлю общую информацию. Прежде всего асинхронно не обязательно означает не по порядку, если это то, что вы принимаете. Операции могут обрабатываться асинхронно, по порядку или не по порядку, это не имеет отношения к используемой модели параллелизма.

Теперь, вообще говоря, каждая функция, возвращающая значение (если это значение не является обещанием) работает синхронно по необходимости, просто потому, что она не может вернуть ничего, что у нее нет. В этом смысле само обещание фактически создается и возвращается синхронно. То, что делается асинхронно, - это разрешение обещания.

Каждая функция, которая выполняет обратный вызов, обычно работает асинхронно, но это не обязательно. Обратный вызов можно вызвать синхронно, и иногда он, как и в обратном вызове метода массивов и строк .map(). Каждая функция, которая возвращает обещание, должна работать асинхронно, но также можно разрешить обещание синхронно, прежде чем возвращать его.

Дело в том, что синхронность и асинхронность - это нечто совершенно отличное от порядка исполнения, и это также зависит от того, используете ли вы обещания или стиль продолжения прохождения.

+0

«Удивление» заключается в том, что все 500 ответов сначала принимаются, прежде чем ЛЮБЫЕ из них ответят. Обработка первого полученного запроса задерживается до тех пор, пока не будут получены все 500 запросов. –