2011-07-25 4 views
0

私は、サードパーティ(ない鉱山)のサーバーに複数のファイルをアップロードします。GAEとgoogle.appengine.runtime.DeadlineExceededError

for argument in files_arguments: 
    files_counter +=1 
    file_size = len(self.request.get(argument))/(1024.0*1024.0) 
    if file_size <= 1: 
     files.append(MultipartParam('file1', self.request.get(argument), 'file'+str(files_counter)+'.jpg', 'application/x-www-form-urlencoded')) 
     # sending file 
     data, headers = multipart_encode(files) 
     # try 3 times to send the file 
     for i in range(3): 
      try: 
       result = urlfetch.fetch(url=self.request.get('upload_url'), 
             payload=''.join(data), 
             method=urlfetch.POST, 
             headers=headers, 
             deadline=10 
             )    
       break 
      except DownloadError: 
       logging.error('(POST) ... DownloadError during file upload, attempt ' + str(i)) 
       pass 
      except DeadlineExceededError: 
       logging.error('(POST) ... DeadlineExceededError during file upload, attempt ' + str(i)) 
       pass 
     if result.status_code == 200: 

及び〜10日のファイルに私はそのDeadlineExceededErrorを取得しています。 これを避けるにはどうすればよいですか?

答えて

3
  • まだ実行していない場合は、実行をtaskに延期できるように、コードを再因子付けします。 タスクの締め切りは10分、通常の要求の場合は30秒です
  • さらに、各ファイルのアップロードが自分のタスクになるように問題を分割します。 これはまた、失敗したときにタスクがautomatically retryになる可能性があるため、「再試行」コードを冗長にするという利点があります。
  • 各アップロードに10分以上かかる場合、長時間実行されるプロセスを処理するには、Backendsを使用する必要があります。
+0

また、非同期URLFetch APIを調べると、複数のアップロードを同時に行うことができます。 –

+0

@Chris Farmiloe、私の場合はどのようにタスクを使用するかわかりません。現在私は次のことを行います - ファイルをアップロードし、結果データを保存し(サーバーはファイル固有のIDを持つjsonを返します)、memcacheにすべてのファイルがアップロードされたら、一意のIDを渡した別のURLを開きます。このユニークなIDに基づいて、私はmemcacheのレコードを特定し、処理します。だから、私はすべてのファイルがアップロードされ、それが開いた後に別のURLを待ってから待つ必要があります。私はどのようにタスクで同じことをすることができますか? –

+0

おそらく、代わりに遅延タスクを使用する必要があります(http://code.google.com/intl/ru/appengine/articles/deferred.html)。 –