Потоки, занимающие большое количество процессора - PullRequest
1 голос
/ 06 марта 2011

Я использую Thread, чтобы помочь создавать потоки в perl;Я бы сказал, что я довольно плохо знаком с потоками.

В моей программе есть переменная, называемая "max threads".Если количество потоков падает ниже этого числа, будет предложено новое.Я использую цикл while, чтобы сравнить текущее количество существующих потоков с переменной максимальных потоков.

Я предполагаю, что цикл while - это то, что потребляет мой процессор.

В любом случае могу ли я получить поток 'boss' или 'manager' (основной поток) не берущимкак много процессоров при организации и управлении потоками?Если мой ЦП повышается только из-за потока менеджера, то в конечном итоге нет никакого смысла в многопоточности!

Ответы [ 3 ]

3 голосов
/ 08 марта 2011

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

Гораздо более простая модель состоит в том, чтобыиметь пул рабочих и давать им работу через Thread :: Queue.

my $q = Thread::Queue->new();

my @workers;
for (1..$MAX_WORKERS) {
    push @workers, async {
       while (my $job = $q->dequeue()) {
           ...
       }
    };
}

for (...) {
    $q->enqueue(...);
}

# Time to exit
$q->enqueue(undef) for 0..$#workers;

# Wait for workers to finish.
$_->join() for @workers;
2 голосов
/ 06 марта 2011

Я не использую Perl, но, говоря с точки зрения общего асинхронного программирования, вам нужен менеджер пула потоков, который не забивает основной поток, и это можно сделать несколькими способами.Во-первых, вы можете выделить поток (ууу!) Для выполнения чего-то подобного (псевдокод):

while program not terminating:
   wait a quarter-second or so, then
      do your "are-there-enough-threads" check

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

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

1 голос
/ 06 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...