Django Прерванный системный вызов при отправке электронной почты - PullRequest
0 голосов
/ 22 мая 2010

Иногда при отправке формы (практически любой формы на моем сайте, которая отправляет мне электронное письмо) я получаю следующую ошибку:

File "/usr/lib/python2.5/smtplib.py", line 603, in starttls
   (resp, reply) = self.docmd("STARTTLS")

 File "/usr/lib/python2.5/smtplib.py", line 378, in docmd
   return self.getreply()

 File "/usr/lib/python2.5/smtplib.py", line 352, in getreply
   line = self.file.readline()

 File "/usr/lib/python2.5/socket.py", line 381, in readline
   data = self._sock.recv(self._rbufsize)

error: (4, 'Interrupted system call')

Мой код отправляет письмо по электронной почте. Я также использую контактную форму Django, которая делает то же самое.

Проблема не всегда возникает. Это кажется очень случайным. Сегодня однажды стало так плохо, что он отображал ошибку каждый раз, когда я отправлял форму.

Перезапуск apache исправляет проблему для одной отправки, а затем делает это снова.

Я проверил ОЗУ и доступно много (доступно около 350 МБ).

Может ли кто-нибудь привести меня в правильном направлении? Что означает эта ошибка? Что я могу сделать, чтобы предотвратить это.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 июля 2010

В качестве обходного пути вы можете попробовать увеличить сокет timeout .

Что касается исправления, у вас может не быть стабильного соединения с сервером GMail, и не может быть способа обойти это.

Похоже, что сигнал EINTR генерируется до того, как вызов recv вернет какие-либо данные.

0 голосов
/ 23 февраля 2011

Вызов recv, используемый smtplib, прерывается сигналом перед чтением любых данных.Для man-страницы read (2) POSIX разрешает read (), прерываемому после чтения некоторых данных, возвращать -1 (с errno, установленным в EINTR) или возвращать количество прочитанных байтов.EINTR вызывает IOError: «[Errno 4] Прерванный системный вызов» (EINTR == 4).

Примером правильной обработки EINTR является subprocess.communicate ().См. Отличный пост здесь: http://znasibov.info/blog/post/inside-python-subprocess-communication.html

Однако в Python 2.5 socket.readline () неправильно обрабатывает EINTR.См .: http://bugs.python.org/issue1628205: интерфейс socket.readline () не обрабатывает EINTR должным образом

0 голосов
/ 22 мая 2010

Я бы сказал, что это связано с плохим сетевым подключением к серверу SMTP. Похоже, что он прерывается при попытке прочитать ответ с сервера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...