1

私の AppEngine アプリケーションは、urlfetch を使用して、机の下にあるコンピューターで実行している Web サーバーにヒットします。時折、呼び出しが次のエラーで失敗することがあります。助けていただければ幸いです。

エラー: [Errno 35] リソースが一時的に利用できません

では具体的に。

urlfetch の呼び出しはタスク内で実行され、次のようになります。

r = urlfetch.fetch( URL,
                    payload = urllib.urlencode( { selector: ','.join(records),
                                                  'reason': explain_request,
                                                } ),
                    method = urlfetch.POST,
                    deadline = 600,
                  )

いくつかの観察:

  • 呼び出しは通常、レコードのリストが長い場合 (たとえば、「結合」後 100 KB) に失敗し、リストが短い場合に成功するように見えます。(注意:このページによると、urlfetch 要求のサイズ制限は 10 MB を超えそうにありません。)

  • 私はこれを GAE 開発環境でのみ試しましたが、GAE 自体にはデプロイしませんでした。

  • GAE 開発環境と同じコンピューターでサーバーを実行すると、urlfetch 呼び出しは常に成功します。

私の机の下にあるコンピューターのサーバーに関する限り:

  • 応答が遅いわけではありません。応答を計算するのに 1 秒もかからず、場合によっては 1 秒強かかります。あたかも GAE が応答を待たないかのようです。

  • GAE 開発環境のコンピューターに全体としてインターネット (つまり、イントラネットではない) を介して接続されます。

  • Python の SimpleHTTPServer を使用して初めて実装しました。

  • CherryPyを使って2回目に実装しました。私が CherryPy のデフォルト設定に加えた唯一の変更は、ポートを設定し、server.socket_host を「0.0.0.0」に設定することでした。

ブロッキング サーバーと非ブロッキング サーバーについて Web で読んだことに基づいて、次に試みることは、Tornado のような明示的に非同期のサーバーを使用してサーバーを実装することです。

しかし、ブロックと非ブロックは昨日の時点で私にとって新しい概念だったので、真の理解を持つ誰かがこの問題に対するより直接的な攻撃を指摘してくれることを願っています.

ありがとうございました。


2013 年 5 月 28 日に追加: まあ、私は問題や回避策を理解していませんでしたが、将来誰かがそれに取り組む場合に備えて、さらに 2 つの手がかりを提供します: (1) GAE に展開したときに表示されなかった、(2)この問題は、机の下にあるサーバーの応答よりも、POST パラメータのサイズに関係しているようです。

4

0 に答える 0