12
votes

Comment puis-je limiter la concurrence de la promesse Q?

Comment écrivez-moi une méthode qui limite Q Promise Concurrence?

Par exemple, j'ai une méthode SwawnProcess . 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.

Ce que je dois implémenter est une fonction avec la signature xxx

que je puisse appeler comme xxx

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.


6 commentaires

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 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?


4 Réponses :


2
votes

Cela semble fonctionner pour moi.

Je ne suis pas sûr que si je pouvais le simplifier. La récursion dans planchedulenextjob exécuter et limite ++ exécute toujours dans la même tick.

également disponible en tant que gist. xxx


0 commentaires

9
votes

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)));


4 commentaires

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 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)



2
votes

the différé La mise en œuvre de la promesse a gate fonction qui fonctionne exactement de cette façon: xxx


0 commentaires

2
votes

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: xxx

Il peut également être utilisé pour limiter la concurrence à une ressource spécifique, comme celle-ci: < / p> xxx


0 commentaires