2011-02-07 16 views
2

私は最初のGAEアプリケーションをビルドしてデバッグしようとしていて、デフォルトのキューで処理されているタスクを取得するためにStackoverflowersの素晴らしいサポートを既に受けています。ありがとう!Google App EngineのチャネルとTaskQueues(クライアントのデバッグ)

しかし、バックグラウンドで「長い」作業を行う方法を示すために、キューを使用したかったのです。私の考えは:

  1. 大きいファイルを処理する要求を受け取りました。
  2. ファイルを格納してタスクをエンキューします。
  3. 応答を返します。
  4. ファイルをバックグラウンドで処理します。
  5. クライアントは、チャンネルを介して、作業が完了したことを知らせます!

私はこれすべてが問題なく動作しています。私の開発サーバーでは、タスクキューはバックグラウンドでタスクを処理していないようです。長時間の作業をシミュレートするために、私はそこで睡眠をとった。

def post(self): 
    time.sleep(60) 
    #use a channel to let the client know we're done 

GAE開発サーバーはシングルスレッドであるようです。アイテムがキューから処理されるまではまったく応答しません。この仮定は正しいのでしょうか?何か案は?

おかげ

コードexanplesの追加:

#code to enqueue task 
taskqueue.add(url='/processSubmission', params={'key': activity.key() }, transactional=False) 

#class that processes queued work 
class ProcessSubmission(webapp.RequestHandler): 
    def post (self): 
    time.sleep(60) 
    activity = db.get(db.Key(encoded=self.request.get('key'))) 
    activity.approved = True 
    activity.put() 
    channel.send_message(activity.userid, 'Wahoo! we are done') 
+0

コードの関連部分を投稿することはできますか? – systempuntoout

+0

完了 - コードを追加しました。希望であれば十分です。 – ConfusedNoob

答えて

2

はい、アプリエンジンdev_appserverはシングルスレッドであり、一度に単一の要求を処理します。ただし、タスクキュー要求の処理を開始する前に、ユーザーに面会した要求が返される必要があります。

+0

私は今この数多くの方法をテストしましたが、実際にはそうではないようです。キューに入れられたアイテムを完了する前にそれが戻ってくることは確かですか?もしあなたが正しいのであれば、チャンネルを使った私のサンプルがうまくいくはずです(私は注意しなければなりません、より簡単な設定を試しました)。 – ConfusedNoob

+1

@ConfusedNoobはい - タスクはユーザリクエストに対して非同期に実行されます。ただし、dev_appserverのChannel APIはポーリングを使用するため、タスクの実行が終了するまでポーリングリクエストは処理されません。これが原因である可能性があります。 –

+0

これはシナリオ全体が正常に動作しない理由を説明しますが、60秒間待ち続ける応答をなぜ受け取らないのかを説明します。 – ConfusedNoob