あなたが言ったように、このポストはもう妥当性を保持しませんが、それは石鹸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())
「完了待ち」メソッドまたはコールバックなどについてAPIをチェックしてください。たぶん、使用する機能を、完了するまでブロックする方法で呼び出すこともできます。 – Hurkyl
使用しているAPIがより良い方法を提供している場合を除き、 APIの詳細がなければ、これは本質的に私たちにあなたに伝えることができます。 –