2

私のスクリプトは、RSSページのコンテンツを取得し、そのページのURLを取得してリストに保存し、各URLのコンテンツを取得して、ページのコンテンツを電子メールで送信します。すべてが非常にうまく機能しています。リスト内のすべてのリンクを送信することはできません。通常、リストには約22のリンクがあります。複数のリンクの内容を1つのメールにまとめたくありません。タイムアウトを追加しないと、次のようなクォータ超過エラーが発生します

<class 'google.appengine.runtime.apiproxy_errors.OverQuotaError'>: The API call mail.Send() required more quota than is available. 

「time.sleep(9)」を追加して速度を落とした後、このエラーが発生します。

<class 'google.appengine.runtime.DeadlineExceededError'>: 
Traceback (most recent call last):

これが私のコードです。何か考えはありますか?

size = len(my_tabletest)
a=2 
while a < size:
  url = my_tabletest[a].split('html</link>')[0] + "print"
  url_hhhhhh = urlfetch.fetch(url)
  my_story = url_hhhhhh.content
  my_story = my_story.split('<div class="printstory">')[1]
  my_story_subject = my_story.split('<h1>')[1]
  my_story_subject = my_story_subject.split('</h1>')[0]
  my_story =  ''.join(BeautifulSoup(my_story).findAll(text=True))
  message = mail.EmailMessage(sender="me<me@someplace.com>",
  subject=my_story_subject)
  message.to = "Jim <me@someplace.com>"
  message.body = my_story
  message.html = my_story_html
  message.send()
  time.sleep(9)
  a=a+1
4

1 に答える 1

6

スタック オーバーフローへようこそ!

タスク キューは、この問題を解決するために構築されています。遅延ライブラリを使用して、既存のコードへの変更を最小限に抑えて活用できます。

を呼び出す代わりに、次のmessage.send()ようにします。

def send_email(message):  
  message.send()

deferred.defer(send_email, message)

これにより、メインのリクエスト ハンドラーが戻った後、バックグラウンドでメールを送信するアドホック タスクのバッチが作成されます。これらのタスクの一部は、アプリが送信メールの短期クォータ制限に達するため、最初の試行で失敗する可能性があります。それで大丈夫です; 失敗したタスクはバックオフし、成功するまで自動的に再試行します。

編集:ああ、sleepあなたのコードから取り出してください。=)

編集 #2: urlfetch をタスクに移動することでさらに高速化できるため、各タスクは 1 つの URL を取得してから 1 つのメールを送信します。1 つのリクエスト ハンドラで 22 個の URL をフェッチすると、メールの送信とは関係なく、タイムアウトが発生する可能性があります。

于 2011-05-01T01:21:51.400 に答える