Как сделать Perl поток без копирования всех переменных? - PullRequest
6 голосов
/ 15 июля 2010

У меня есть одна Perl-программа, в которой было бы полезно использовать некоторую форму параллелизма.

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

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

Что я должен использовать, чтобы создать новый поток без копирования?Или есть несколько лучших реализаций потоков, которые не копируют все?

Ответы [ 3 ]

7 голосов
/ 15 июля 2010

Как синтаксис легкость потоков, но не весь жир?Используйте удивительный модуль вилки !Он реализует интерфейс потоков с использованием fork и IPC, облегчая обмен данными между дочерними процессами.

4 голосов
/ 15 июля 2010

На самом деле, вам просто нужно избегать 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.Там не действительно хорошее решение для этого.

3 голосов
/ 15 июля 2010

Используйте системный вызов fork (2) , чтобы воспользоваться Копирование при записи .

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