2010-05-21 45 views
0

有時候,提交表單(幾乎任何形式的在我的網站,給我發來電子郵件),我收到以下錯誤時:Django的被中斷的系統調用時,電子郵件

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') 

我的代碼通過發送電子郵件Gmail中。我也使用django contact-form來做同樣的事情。

這個問題並不總是會發生。這看起來非常隨意。在今天的某個時候,它變得非常糟糕,每次提交表單時都會顯示錯誤。

重新啓動apache修復了一個提交的問題,然後再次執行該操作。

我檢查了內存,並有大量可用(約350MB可用)。

有人能帶我走向正確的方向嗎?這個錯誤是什麼意思?我能做些什麼來防止這種情況發生。

謝謝。

回答

0

我會說它必須做一個糟糕的網絡連接到SMTP服務器。 看起來像在試圖從服務器讀取回復時被中斷?

+0

有什麼我可以做的,這將防止錯誤發生?就像try:這個,如果失敗了,再試一次。那麼也許3次嘗試後,只需跳過電子郵件發送?如果是這樣,我會爲此採取什麼樣的例外? – mhost 2010-05-22 17:19:45

0

作爲解決方法,您可能需要嘗試增加套接字timeout

至於解決這個問題,你可能沒有一個穩定的連接到GMail的服務器,可能沒有辦法解決這個問題。

看起來EINTR信號在recv調用獲取任何數據之前被拋出。

0

在讀取任何數據之前,smtplib使用的recv調用正被信號中斷。根據read(2)聯機幫助頁,POSIX允許在讀取某些數據後中斷的read()返回-1(errno設置爲EINTR)或返回已讀取的字節數。在Python中,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