раздражение выбора () поведение в c

Вы можете архивировать это, используя потоки.

Выбранная вами библиотека line-by-line поддерживает их, поэтому вам остается только сделать это следующим образом:

  • создать читаемый поток (сформировать файл в файловой системе или из онлайн-ресурса через http)
  • передать поток в вашу библиотеку и прослушать события

Это работает, обратите внимание, что вам нужно требовать http или https на основе вашего URL, мой пример - https

const http = require('https');
const LineByLineReader = require('line-by-line')

const options = {
  host: 'stackoverflow.com',
  path: '/questions/54251676/how-to-read-file-by-url-in-node-js',
  method: 'GET',
};

const req = http.request(options, (res) => {
  res.setEncoding('utf8');

  lr = new LineByLineReader(res);


  lr.on('error', function (err) {
    console.log('err', err);
  });

  lr.on('line', function (line) {
    console.log('line', line);
  });

  lr.on('end', function () {
    console.log('end');
  });

});
req.on('error', (e) => {
  console.log('problem with request', e);
  req.abort();
});
req.end();
5
задан deadcyclo 12 November 2008 в 23:24
поделиться

3 ответа

выбор изменяет свои аргументы. Действительно необходимо повторно инициализировать его каждый раз.

Если Вы обеспокоены издержками, стоимость обработки полного FD_SET в ядре является несколько более значительной, чем стоимость FD_ZERO. Вы хотели бы только передать в своем максимуме fd, не FD_SETSZIZE, минимизировать обработку ядра. В Вашем примере:

switch (select((sd + 1),&set,NULL,NULL,&timeout))

Для более сложного случая с несколькими fds Вы обычно заканчиваете тем, что поддержали макс. переменную:

FD_SET(sd,&set);
if (sd > max) max = sd;
... repeat many times...

switch (select((max + 1),&set,NULL,NULL,&timeout))


Если Вы будете иметь большое количество дескрипторов файлов и обеспокоены издержками schlepping их о, необходимо посмотреть на некоторые альтернативы выбору (). Вы не упоминаете ОС, которую Вы используете, но для подобных Unix Ose существуют некоторые:

  • для Linux, epoll ()
  • для FreeBSD/NetBSD/OpenBSD/MacOS X, kqueue ()
  • для Соляриса,/dev/poll

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

12
ответ дан 18 December 2019 в 08:32
поделиться

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

Всегда инициализируйте fd_set право перед использованием его.

7
ответ дан 18 December 2019 в 08:32
поделиться

Это - способ, которым работает выбор. Это работает лучше всего и имеет больше смысла, если у Вас есть больше чем один сокет. Это - вид точки: Вы выбираете через многие сокеты. Если Вы хотите читать из одного сокета, просто чтение или recv это.

0
ответ дан 18 December 2019 в 08:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: