2010-03-04 7 views
10

Quel est le nom de la méthode/technique suivante (je vais essayer de décrire le mieux possible, un rappel sur "mémoization" est probablement nécessaire pour comprendre pourquoi cette technique peut être très utile):Nommez cette technique (elle peut être appelée 'piggybacking')

vous commencez certains calculs asynchrones potentiellement lenghty et vous réalisez qu'un calcul identique a déjà été commencé mais pas encore fait et vous « ferroutage » sur le premier calcul. Ensuite, lorsque le premier calcul se termine, il n'émet pas un mais deux rappels.

Le but est de ne pas démarrer inutilement un deuxième calcul car vous savez qu'il y a déjà un calcul identique en cours d'exécution. Notez que, bien que pas tout à fait différent, je ne cherche pas le cas particulier de la mise en cache que "memoization" est: memoization est quand vous commencez un calcul et trouvez un résultat caché (memoized) de ce même de calcul qui est déjà fait que vous pouvez réutiliser.

Ici, je cherche le nom de la technique qui est un peu similaire à la mémoisation (en ce sens qu'elle peut être utile pour certaines des mêmes raisons que la mémoisation est une technique utile), sauf qu'elle réutilise le résultat du premier calcul même si le premier calcul n'est pas encore fait au moment où vous émettez le deuxième calcul.

J'ai toujours appelé cette technique "piggybacking" mais je ne sais pas si c'est correct.

Je l'ai utilisé plus d'une fois comme une sorte de "mémoization sur les stéroïdes" et c'est très pratique. Je ne sais pas quel est le nom de cette technique (avancée?).

EDIT

Merde, je voulais faire des commentaires sur la réponse de epatel mais il a disparu. La réponse de epatel m'a donné une idée, cette technique pourrait être appelée "memoization paresseux" :)

+0

Fil d'annulation? –

+0

@Robert Harvey: googling sur "Thread cancellation" :) hummm ... Le problème, je pense, c'est que l'annulation de threads a beaucoup de sens et qu'ici, selon l'implémentation, vous pouvez même ne pas commencer du tout le long thread asynchrone parce que vous êtes directement sur l'autre. – cocotwo

+1

J'ai vu "piggybacking" utilisé dans un contexte différent mais pour la même idée: le nouveau venu profite du surcoût qui a déjà été (ou est en train de) être payé par quelqu'un d'autre. Ne laissez pas cela vous empêcher de trouver ou de définir un travail particulier à votre contexte. –

Répondre

2

Dans certains contextes, j'ai entendu cela appelé "demande de fusion".

4

Ceci est juste memoization des contrats à terme.

Normal "impatient" memoization fonctionne comme ceci:

f_memo(x): 
    critical_section: 
    if (exists answers(f,x)) 
     return answers(f,x) 
    else 
     a = f(x) 
     answers(f,x) = a 
     return a 

Maintenant, si f (x) retourne terme au lieu des résultats réels, le code ci-dessus fonctionne comme est. Vous obtenez l'effet de ferroutage, à savoir comme ceci:

  1. fil d'abord appelle f (3)
  2. Il n'y a pas de réponse stockée pour f (3), donc dans la section critique, il y a un appel à f (3) .f (3) est implémenté comme renvoyant un futur, ainsi la 'réponse' est prête immédiatement; 'a' dans le code ci-dessus est défini sur le futur F et le futur F est stocké dans le tableau des réponses
  3. Le futur F est retourné comme le "résultat" de l'appel f (3), qui est potentiellement toujours en cours
  4. Un autre thread appelle f (3)
  5. l'avenir F se trouve de la table, et renvoyée immédiatement
  6. maintenant, les deux fils ont poignée pour le résultat du calcul; quand ils essaient de le lire, ils bloquent jusqu'à ce que le calcul soit prêt --- dans le post ce mécanisme de communication a été mentionné comme étant implémenté par un rappel, vraisemblablement dans un contexte où les futurs sont moins communs
+0

Exactement ce que je pensais lire la question. Les contrats à terme ne sont pas tellement utilisés mais ils sont si prometteurs (si vous obtenez des threads bon marché comme go coroutines). –

+0

@ antti.huima: Je suppose que cela dépend de ce que vous préférez: avoir deux threads (ou plus) bloqués en attente d'un futur (ce qui est Matthieu M allusions à: vous avez besoin de threads bon marché) ou d'interroger un futur est fait ou pour utiliser la notification de rappel instantanée à la fin. Je suis d'accord que quand il est mis en œuvre en utilisant le futur c'est une "mémoisation des futurs" mais l'avenir n'est pas la seule façon de le faire. J'utilise quelque chose de plus comme un callback "ProgressOrResultHandable", qui, d'un point de vue de passage de message est IMHO beaucoup plus propre que futur. Pas de blocage, pas de temps mort, pas de sondage. Notification de rappel instantanée. – cocotwo

+0

@cocotwo callbacks sont en effet plus propres si vous programmez de manière événementielle. Les futurs sont utilisés lorsque les threads et le parallélisme sont communs et qu'ils sont inutiles autrement. Par exemple, considérons: for (i = 0; i <100; i ++) pages [i] = fetch_web_page (url [i]); Si fetch_web_page génère un thread et renvoie un futur, il s'alignera automatiquement sans autres constructions de programmation! En pratique, les contrats à terme faciliteraient l'interrogation s'ils sont prêts, c'est-à-direplus tard, vous pouvez demander à is_ready (pages [i]) de faire un rapport d'avancement sans bloquer; vous bloquez lorsque vous accédez réellement aux résultats. –

Questions connexes