Неблокирующие именованные каналы

Краткое изложение проблемы: мне удалось значительно ускорить просмотр изображений при загрузке по сравнению с тем, что было раньше, за счет использования параллелизма. Теперь мне нужно защитить этот параллелизм от состояния гонки. Я собирался, чтобы зависимый скрипт опрашивал обычные файлы на предмет статуса независимого, но потом решил, что именованные каналы будут лучше. Каналы, чтобы избежать опроса и именованные, потому что я не могу получить PID из сценария, который их открывает (это тот, с которым мне нужно использовать каналы для общения).

Поэтому, когда изображение загружается, клиент отправляет POST через AJAX в скрипт, который 1) сохраняет изображение 2) порождает параллельный скрипт (независимый) для просмотра изображения и 3) возвращает JSON об изображении клиенту. Затем клиент немедленно запрашивает отсканированную версию, которую мы, надеюсь, успели подготовить во время отправки ответа. Но если он не готов, Apache mod_переписывает путь так, чтобы он указывал на второй скрипт (зависимый), который ожидает завершения просмотра, а затем возвращает данные изображения.

Я ожидал, что это будет довольно просто, но, тестируя независимый скрипт через терминал, я получаю следующее:

$ php -f thumb.php -- img=3g1pad.jpg
successSegmentation fault

Источник находится здесь: http://codepad.org/JP9wkuba Я подозреваю, что получаю segfault, потому что этот fifo я made все еще открыт и теперь осиротел. Но мне нужно, чтобы его увидел зависимый скрипт, верно? И разве он не должен быть неблокирующим? Я полагаю, это потому, что остальная часть скрипта может работать.... но не может завершиться? Это будет работа для обычного файла, как я думал в начале, за исключением того, что если оба открыты, я не хочу проводить опрос. Я хочу провести опрос максимум один раз и покончить с этим. Мне просто нужно опросить и игнорировать уродство?


person Grault    schedule 15.03.2011    source источник
comment
Я понимаю, что это не даст прямого ответа на ваш вопрос, но почему вы выбрали этот невероятно причудливый маршрут, а не использовали очередь работы/сообщений, как у Gearman?   -  person Charles    schedule 15.03.2011
comment
@Charles: Хм, я слышал об этом, но не знал точно, что он делает. Но мне действительно не нужен еще один API для изучения на данный момент.   -  person Grault    schedule 16.03.2011
comment
Два-четыре метода, о которых вам придется беспокоиться, тривиальны для изучения по сравнению с усилиями, необходимыми для того, чтобы выкарабкаться из трясины именованных каналов, в которой вы оказались. :) Gearman даже позволяет вам отправлять данные о статусе обратно во время обработки, что-то, на что у вас, похоже, есть хороший аргумент. (Отправка обратно информации о состоянии на самом деле значительно увеличивает сложность процесса поиска задания — он переходит от «выстрелил-забыл» / «выстрелил-и-жду» к флагам «выстрелил-и-зацикливался-при-обработке».)   -  person Charles    schedule 16.03.2011
comment
Согласен, Gearman стоит посмотреть, или php-resque может быть немного проще для вас (использовал оба с большим успехом)   -  person Ian Selby    schedule 16.03.2011
comment
@ Чарльз, почему бы не сделать твой комментарий ответом? Я вижу, что это достаточно высоко оценено для этого;)   -  person Vladislav Rastrusny    schedule 28.03.2011
comment
@FractalizeR, я обнаружил, что «Сделай это вместо того, чтобы ты сошёл с ума» не всегда подходит в качестве фактического ответа, хотя в данном случае это уместно. В конце концов, я вполне могу сделать преобразование ответов.   -  person Charles    schedule 28.03.2011


Ответы (1)


Вам необходимо удалить созданные файлы FIFO, а затем завершить все сценарии.

person Liutas    schedule 28.03.2011