Почему мои потоки Perl выполняются случайным образом при первом запуске, но по порядку при последующих запусках? - PullRequest
2 голосов
/ 23 февраля 2010

В ходе тестирования кода для вопроса Как я могу сохранить состояние для потока между вызовами в Perl? Я заметил, что при первом запуске скрипта выполнение потоков довольно хорошо чередуется друг с другом. Но при всех последующих выполнениях скрипта все потоки работают почти идеально в порядке их создания с очень небольшим чередованием. Это Perl ithreads на Ubunutu 9.04.

Может быть, кто-нибудь мог бы просветить меня о том, что происходит?

Ответы [ 2 ]

3 голосов
/ 24 февраля 2010

Ваши потоки работают в порядке создания в основном из-за подробностей реализации в Perl и операционной системе (главным образом потому, что их индивидуальное время выполнения ниже самого короткого интервала времени выполнения операционной системы). Чтобы чередовать потоки, вы можете использовать sleep вместо yield (или заставить потоки выполнять какую-то реальную работу).

Имейте в виду, что yield в потоках Perl - это всего лишь предложение, которое отличается от того, как yield работает в некоторых других языках. Поскольку потоки Perl являются параллельными и в основном управляются планировщиком операционной системы, если вы не используете какой-либо мьютекс для блокировки выполнения, на самом деле невозможно предсказать их порядок выполнения.

3 голосов
/ 23 февраля 2010

Планирование потоков - сложная деталь реализации ОС. Попытка выяснить, как это работает, наблюдая, как запланированы потоки, практически невозможна. И вы не должны делать какие-либо предположения на основе этих наблюдений. На другом оборудовании ОС может планировать потоки по-разному.

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