5

नीचे दिए गए उदाहरण का उपयोग करके future1 के परिणाम का उपयोग future1 पूरा हो जाने के बाद (future3 को सबमिट किए जाने से अवरुद्ध किए बिना)?गैर-अवरुद्ध तरीके से वायदा श्रृंखला कैसे करें? यही है, बिना भविष्य के किसी अन्य भविष्य में एक इनपुट के रूप में एक भविष्य का उपयोग कैसे करें?

from concurrent.futures import ProcessPoolExecutor 
import time 

def wait(seconds): 
    time.sleep(seconds) 
    return seconds 

pool = ProcessPoolExecutor() 

s = time.time() 
future1 = pool.submit(wait, 5) 
future2 = pool.submit(wait, future1.result()) 
future3 = pool.submit(wait, 10) 

time_taken = time.time() - s 
print(time_taken) 

उत्तर

4

यह पहली बार पूरा होने के बाद दूसरा ऑपरेशन सबमिट करने के लिए कॉलबैक को सावधानीपूर्वक तैयार करके प्राप्त किया जा सकता है। अफसोस की बात है, 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_stateasyncio.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) 
संबंधित मुद्दे