Не так давно столкнулся с неприятным и действительно досадным багом в Perl в cygwin64 окружении. Сам по себе баг заключается в том, что модуль Image::Magick не thread-safe. А натолкнулся я на этот баг в скрипте для irssi.

Есть у меня такой скриптец, который скачивает все урлы картинок, о которых люди упоминают в irc. Дело в том, что не все ресурсы правильно отдают mime-type, в частности за Tiny-Tiny RSS числится как раз такой бажок, закэшированные картинки всегда отдаются как image/png, даже если это не png. Ну и на всякий случай, чтобы картинки были корректно именованы, в скрипте проверяется mime-type, а когда объект скачан, происходит вызов функции ping из Image::Magick, которая собственно выдаёт формат картинки. Оверкил, конечно, но тем не менее. А поскольку irssi работает по тому же принципу, что и nginx (кольцевые очереди событий), события должны протекать как можно быстрее, а если подразумевается какое-то долгоиграющее действие, то его следует делать асинхронно, то есть запускать коллбэком, желательно ещё и отдельным тредом. Irssi с тредами работает несколько со скрипом (сыпет warning-ами, если использовать use strict; use warnings "all";), но работает. В windows перловый threads работает вообще на грани фола, а тут ещё и Image::Magick со своими тараканами... Вобщем, пришлось дописать исключение для такой ситуации.

Next Post