2016-08-25 7 views
0

特定のAPIからのレポートをトリガーするスクリプトを作成した後、それをデータベースにロードしました。 私はすでに動作するものを作っていますが、スクリプトを何度も何度も繰り返す必要がなく、もう少し "正確"で効率的なものがあるかどうかを知りたいと思います。ループなしの状態を待つPython

私の現在のスクリプトは以下の通りです:APIは、それが持っているほとんどがステータスを返すエンドポイントである、完了メソッドのいずれかの待機を提供していません

import time 

retry=1 
trigger_report(report_id) 

while report_id.status() != 'Complete': 
    time.sleep(retry * 1.3) 
    retry =+ 1 

load_report(report_id) 

EDIT仕事の SOAP APIです。

+0

「完了待ち」メソッドまたはコールバックなどについてAPIをチェックしてください。たぶん、使用する機能を、完了するまでブロックする方法で呼び出すこともできます。 – Hurkyl

+3

使用しているAPIがより良い方法を提供している場合を除き、 APIの詳細がなければ、これは本質的に私たちにあなたに伝えることができます。 –

答えて

0

あなたが言ったように、このポストはもう妥当性を保持しませんが、それは石鹸APIです。しかし、私はそれに仕事を入れたので、私はとにかくそれを投稿します。 :)

質問にお答えします。私はそれを行うには、複数の方法があります


(別名。何度も何度もループする)ポーリングよりも任意のより効率的な方法が表示されません。

最初の方法は、タスクが完了したときにトリガーされるコールバックを実装することです。あなたが見ることができるようにメッセージ「Done 6」は、すぐに操作が完了したとして印刷されます、

import time 

def expensive_operation(callback): 
    time.sleep(20) 
    callback(6) 

expensive_operation(lambda x:print("Done", x)) 

:それはこのようになります。

これをFuture-objectsで書き換えることができます。

from concurrent.futures import Future 
import threading 
import time 

def expensive_operation_impl(): 
    time.sleep(20) 
    return 6 

def expensive_operation(): 
    fut = Future() 
    def _op_wrapper(): 
     try: 
      result = expensive_operation_impl() 
     except Exception as e: 
      fut.set_exception(e) 
     else: 
      fut.set_result(result) 

    thr = threading.Thread(target=_op_wrapper) 
    thr.start() 

    return fut 

future = expensive_operation() 
print(future.result())    # Will block until the operation is done. 

これは複雑に見えるので、スレッドスケジューリングを実装するいくつかの高度な機能があります。

import concurrent.futures import ThreadPoolExecutor 
import time 

def expensive_operation(): 
    time.sleep(20) 
    return 6 

executor = ThreadPoolExecutor(1) 
future = executor.submit(expensive_operation) 

print(future.result()) 
-3

ポーリングではなくイベントを使用します。 Pythonでイベントを実装する方法には、多くのオプションがあります。ディスカッションhere already on stack overflowがありました。ここで

は、合成例で受け入れ答えにzope.eventとイベントハンドラ

import zope.event 
import time 


def trigger_report(report_id): 
    #do expensive operation like SOAP call 
    print('start expensive operation') 
    time.sleep(5) 
    print('5 seconds later...') 
    zope.event.notify('Success') #triggers 'replied' function 

def replied(event): #this is the event handler 
    #event contains the text 'Success' 
    print(event) 

def calling_function(): 
    zope.event.subscribers.append(replied) 
    trigger_report('1') 

しかし、先物などを使用してもきちんとしています。あなたのボートを浮かせるものによって異なります。

+2

書面による質問への答えになるためには、通常イベントを発生させるコードの部分を制御していないときに、イベントの使用方法を説明しなければなりません。 – Hurkyl

+0

誰もその時間がありません –

関連する問題