Не блокируют операции ввода-вывода в Perl, ограниченном одним потоком? Хороший дизайн?

Я хотел бы рекомендовать ack - лучше, чем grep, мощный инструмент поиска для программистов .

$ ack --color --passthru --pager="${PAGER:-less -R}" pattern files
$ ack --color --passthru pattern files | less -R
$ export ACK_PAGER_COLOR="${PAGER:-less -R}"
$ ack --passthru pattern files

Мне это нравится, потому что по умолчанию используется рекурсивный поиск по каталогам (и он намного умнее, чем grep -r), поддерживает полные регулярные выражения Perl (а не POSIXish regex(3) ] ) и имеет намного более приятный контекстный контекст при поиске во многих файлах.

5
задан Alex Balashov 2 July 2009 в 14:27
поделиться

1 ответ

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

Можно передать $ client подпрограмме запуска потока или просто сослаться на него в новом потоке:

$client = $server_socket->accept();

threads->new(\&handle_client, $client);
async { handle_client($client) };
# $client will be closed only when all threads' references
# to it pass out of scope.

Для проекта Thread :: Queue один may enqueue () лежащий в основе fd:

$q->enqueue( POSIX::dup(fileno $client) );
# we dup(2) so that $client may safely go out of scope,
# closing its underlying fd but not the duplicate thereof

async {
  my $client = IO::Handle->new_from_fd( $q->dequeue, "r+" );
  handle_client($client);
};

Или можно просто использовать исключительно fds, а форма битового вектора Perl select .

5
ответ дан 14 December 2019 в 19:22
поделиться
Другие вопросы по тегам:

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