Использование синхронизированного приложения имеет большой смысл.Мой вопрос: будет ли переменная logger передаваться потокам?Согласно perlthrtut это не так.Мне еще предстоит это проверить.Если кто-то уже не сделал этого?
Возможно, вы захотите использовать threads::shared
, чтобы поделиться переменной регистратора, но документация threads::shared
указывает, что вы можете использовать только скаляры, массивы или хэши,Я все равно попробовал это с Perl 5.8.8, и, как и ожидалось, он не будет работать.
Другой подход заключается в создании отдельного регистратора для каждой подпрограммы, которая будет вызываться в потоке.Приложений log4perl можно настроить, чтобы избежать блокировки и чередования.Но я серьезно обеспокоен влиянием на производительность, возникающим при создании отдельного экземпляра регистратора для каждого активного потока.
Обновлено: оказывается, что не нужно усложнять.Если вы инициализируете log4perl так, как будто вы пишете однопотоковый скрипт, и вызываете методы объектов logger без каких-либо специальных уловок, все работает так, как объявлено.Объект регистратора не нужно передавать в точку входа потока.Sub, вызываемый в точке входа потока, получает доступ к методам регистратора так же, как если бы он вызывался обычным способом.Синхронизированный аппендер поддерживает все линии.