Comment écrivez-moi une méthode qui limite Q Promise Concurrence?
Par exemple, j'ai une méthode Ce que je dois implémenter est une fonction avec la signature p> que je puisse appeler comme p> J'ai déjà commencé à travailler sur ma version, mais je me demande si quelqu'un a une implémentation concise que je peux vérifier contre. P> p> SwawnProcess code>. Il retourne une promesse Q.
Je ne veux pas plus de 5 processus engendré à la fois, mais de manière transparente au code d'appel. P>
4 Réponses :
Cela semble fonctionner pour moi.
Je ne suis pas sûr que si je pouvais le simplifier. La récursion dans également disponible en tant que gist. p> planchedulenextjob est nécessaire pour que le
exécuter
limite ++ code> exécute toujours dans la même tick. P>
J'ai une bibliothèque qui fait cela pour vous https://github.com/forbeslindesay/throat
Vous pouvez l'utiliser via navigation de navigation ou télécharger la construction autonome à partir de brycdn ( https: // www .brcdn.org /? module = gorge et version = Dernière ) et ajoutez-la sous la forme d'une balise de script. p>
alors (en supposant que le constructeur code> code> est polyfilled ou implémenté dans votre Environnement) Vous pouvez faire: p>
// only allow 3 parallel downloads var downloadedItems = Q.all(items.map(throat(download, 3)));
C'est doux, merci! Votre bibliothèque ressemble à plus de JS idiomatique que de mien. Aussi, tests.
Content que tu trouves ça utile :)
Je préférerais une solution à l'aide d'une bibliothèque couramment utilisée plutôt que du code personnalisé. Existe-t-il une bibliothèque de promesses alternative à Q qui offre cela?
gorge code> est cette bibliothèque couramment utilisée. Si vous utilisez simplement la mise en œuvre de la promesse intégrée dans le nœud, vous n'avez pas besoin de code personnalisé, juste
gorge (mycéen, parallélisme) code>
the différé La mise en œuvre de la promesse a gate code> fonction qui fonctionne exactement de cette façon:
J'ai écrit une petite bibliothèque pour faire ceci: https://github.com/suprememoocow/qlimit
Il est extrêmement facile à utiliser et est spécifiquement conçu pour fonctionner avec q promesses: p> Il peut également être utilisé pour limiter la concurrence à une ressource spécifique, comme celle-ci: < / p>
Ecrivez-vous du code pour le navigateur ou pour le nœud? Si c'est le premier, il n'y a pas de concurrence ...
@Matt: J'écris pour le nœud. Je ne parle pas de concurrence comme dans le fil, je veux dire concurrence comme dans "promesses qui courent en même temps".
Qu'essayez-vous? L'utilisation d'une file d'attente et de demandes tamponnées ne devrait pas être trop difficile.
@schlingel: Je ne dis pas que c'est difficile. Dès que je suis prêt, je posterai le code complet. J'essaie simplement de comprendre comment corriger correctement les promesses de la chaîne afin que le prochain commence dès que i> le précédent a fini.
Si la requête peut être exécutée instantanément, vous pouvez retourner le différé qui est résolu par le processus, au cas où vous devrez la fiter, vous devrez utiliser deux différés séparés. Celui qui appelle une fonction qui diminue le comptoir et résout également le deuxième différé. La deuxième différée doit être renvoyée par la fonction de reprocession de la sonnelle.
@schlingel: Merci pour les conseils. Q Les promesses résolvent toujours de manière asynchrone. Pourriez-vous s'il vous plaît examiner ma réponse?