儘管這篇文章不再像你所說的那樣具有任何相關性,但它是一個soap API。但是我把工作放到了它裏面,所以我會把它貼出來。 :)
要回答你的問題。我沒有看到比輪詢更有效的方法(又稱。循環一遍又一遍)
有多種方法可以做到這一點。
第一種方法是實現任務完成時觸發的某種回調。它會是這個樣子:
import time
def expensive_operation(callback):
time.sleep(20)
callback(6)
expensive_operation(lambda x:print("Done", x))
正如你所看到的,消息「Done 6
」將盡快操作已經完成打印。
你可以用Future對象重寫這個。
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的「等待完成」方法或回調或somesuch。也許你甚至可以以阻塞的方式調用你想要使用的功能,直到完成。 – Hurkyl
除非您使用的API提供了更好的方法,否則。沒有關於API的細節,這基本上是我們可以告訴你的。 –