На самом деле, вам просто нужно избегать ithreads.Они ужасны, и в отличие от любой другой формы потоков на планете, они на дороже, чем обычные тяжеловесные процессы .Мое предпочтительное решение состоит в том, чтобы использовать основанную на событиях инфраструктуру, такую как POE или AnyEvent (я использую POE), и разбивать любые задачи, которые нельзя сделать неблокирующими, в подпроцессы, используя POE :: Wheel :: Run (или fork_call для AnyEvent).Для написания приложения таким способом требуется больше предварительной разработки, но если все сделано правильно, это даст вам эффективный код.Время от времени я также писал код, который просто использует fork
и pipe
(или open '-|'
) и IO::Select
и waitpid
непосредственно в своем собственном цикле событий, но вы, вероятно, должны учитывать, что симптомя выучил C до Perl, а не рекомендации.:)
Слово мудрому, хотя: если вы работаете в Windows, то этот подход может быть почти таким же плохим, как использование ithreads напрямую, так как Perl компенсирует отсутствие в win32 fork()
от используя ithreads , так что вы будете платить ту же самую стоимость создания ithread (в ЦП и памяти) за каждый fork
.Там не действительно хорошее решение для этого.