尽管这篇文章不再像你所说的那样具有任何相关性,但它是一个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的细节,这基本上是我们可以告诉你的。 –