Время ожидания веб-страницы истекает при сохранении на основе изображений и сохранении с помощью Seaside?

Я использую код здесь, чтобы сохранить изображение при создании нового пользователь (глава «Постоянство»)

saveImageWithoutMonitor

 SmalltalkImage current saveSession.


writeMutex

 ^ WriteMutex ifNil: [WriteMutex := Monitor new]

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

PS. Я помню, что вам нужно было настроить его на странице конфигурации Seaside, и он подождал.


person unom    schedule 30.01.2016    source источник


Ответы (1)


При сохранении образа будут обработаны списки выключения и запуска, в ходе которых все сокеты будут уничтожены, следовательно, соединения будут отменены. Что мы делаем, так это разветвляем образ (с помощью OSProcess) и сохраняем его в дочернем процессе. Есть даже метод, который сделает это за вас, см. OSProcess>>saveImageInBackground.

Примечание: при использовании такого разветвленного процесса возникает несколько условий гонки. Если вы имеете дело с нагрузкой, может случиться, например, что дочерний процесс «крадет» сокет у родительского процесса, что приведет к тайм-аутам соединения. Чтобы предотвратить это, вам нужно будет закрыть сокеты во время операции форка, что не так просто решить.

person Max Leske    schedule 31.01.2016
comment
Только в Unix, а не в Windows, AFAIK - person Stephan Eggermont; 31.01.2016
comment
Я на Mac. Я также смотрел на SmalltalkImage››saveAs: он создаст новую сессию изображения и сохранит старую. Концептуально похоже на форк, но реализации отличаются. - person unom; 01.02.2016
comment
Да, реализация OSProcess в основном является копией этого метода, но выполняется только в дочернем процессе. Кстати, это может не работать на Mac, я использую форки только на Linux-машинах. - person Max Leske; 01.02.2016