Mam aplikację Rails 3 w produkcji z Passenger na Apache. Mam ten kod:Używanie fork w Ruby on Rails do tworzenia równoległego procesu
class Billing < ActiveRecord::Base
after_save :sendEmails
private
def sendEmails
fork do
UserMailer.clientBilling(self.user, self).deliver
end
end
end
W localhost, gdy aplikacja tworzy rozliczenia, po jego zapisaniu, aplikacja wysyła wiadomość e-mail do użytkownika, wszystko działa bez zarzutu. Ale na serwerze, po tym, jak aplikacja tworzy fakturę, wyrzuca mi błędy związane z klejnotem MySQL2, błędy takie jak "Serwer MySQL zniknął" lub "Połączenie zgubione", a aplikacja nie wysyła e-maili. Jeśli wyjmę widelec, działa dobrze, ale chcę użyć rozwidlenia, chcę utworzyć oddzielny proces, ponieważ trwa to długo podczas wysyłania wiadomości e-mail. Jaki może być problem?
Czy wiesz, które zasoby są dziedziczone? Myślałem, że fork procesu kopiuje cały proces? czy całe środowisko szyn nie jest ponownie ładowane na widelec? –
Kopiuje cały proces, ale deskryptory plików odwołują się do tego samego pliku (zobacz stronę podręcznika dla widelca). –
Zauważyłem, że 'ustanowienie_łączenia' nie zawsze jest konieczne, ponieważ ActiveRecord zwykle zarządza tym w sposób przezroczysty. – spume