यह पहली बार पूरा होने के बाद दूसरा ऑपरेशन सबमिट करने के लिए कॉलबैक को सावधानीपूर्वक तैयार करके प्राप्त किया जा सकता है। अफसोस की बात है, pool.submit
पर मनमाना भविष्य पारित करना संभव नहीं है, इसलिए दोनों वायदा को एक साथ बांधने के लिए एक अतिरिक्त कदम की आवश्यकता है।
import concurrent.futures
def copy_future_state(source, destination):
if source.cancelled():
destination.cancel()
if not destination.set_running_or_notify_cancel():
return
exception = source.exception()
if exception is not None:
destination.set_exception(exception)
else:
result = source.result()
destination.set_result(result)
def chain(pool, future, fn):
result = concurrent.futures.Future()
def callback(_):
try:
temp = pool.submit(fn, future.result())
copy = lambda _: copy_future_state(temp, result)
temp.add_done_callback(copy)
except:
result.cancel()
raise
future.add_done_callback(callback)
return result
ध्यान दें कि copy_future_state
asyncio.futures._set_concurrent_future_state की एक थोड़ा संशोधित संस्करण है:
यहाँ एक संभव कार्यान्वयन है।
उपयोग:
from concurrent.futures import ProcessPoolExecutor
def wait(seconds):
time.sleep(seconds)
return seconds
pool = ProcessPoolExecutor()
future1 = pool.submit(wait, 5)
future2 = chain(pool, future1, wait)
future3 = pool.submit(wait, 10)