109 votes

Quelle serait la meilleure solution pour les tâches simultanées sur node.js? Des fibres? Web-travailleurs? ou des fils?

Je suis tombé sur node.js il y a quelque temps et l'aime beaucoup. Mais bientôt, j'ai trouvé qu'il manquait gravement la capacité à effectuer les tâches consommatrices d'UC. Donc, j'ai commencé une recherche sur google, et a obtenu ces réponses pour résoudre le problème: les Fibres, les web workers et les Threads (thread-a-gogo). Maintenant que l'on est la confusion et l'un d'eux doit absolument être utilisé - après tout, quel est le but d'avoir un serveur qui est juste bon à IO et rien d'autre? Les Suggestions nécessaires!

Mise à JOUR:

Je pensais à une sorte de hors-la fin, juste besoin de suggestions sur elle. Maintenant, ce que j'ai pensé a ceci: nous allons avoir quelques discussions (à l'aide de thread_a_gogo ou peut-être les web workers). Maintenant, quand nous en avons besoin, nous pouvons en créer d'autres. Mais il y aura une limite sur le processus de création. (pas implicite par le système, mais probablement à cause de la surcharge). Maintenant, quand on dépasse la limite, nous pouvons fourche d'un nouveau nœud, et de commencer à créer des fils sur elle. De cette façon, il peut aller jusqu'à nous arrivons à une certaine limite (après tout, les processus ont aussi une grande surcharge). Lorsque cette limite est atteinte, nous avons commencer à faire la queue tâches. Chaque fois qu'un thread est libre, il sera affecté à une nouvelle tâche. De cette façon, il peut aller en douceur.

Donc, c'était ce que je pensais de. Cette idée est-elle bonne? Je suis un peu nouveau dans tout ce processus et les threads des choses, donc n'ont pas d'expertise dans ce. S'il vous plaît partagez vos opinions.

Merci. :)

4voto

lanzz Points 19475

Je ne sais pas que si les webworkers sont pertinentes en l’espèce, ils sont côté client tech (exécuté dans le navigateur), tout en node.js s’exécute sur le serveur. Fibres, pour autant que je le comprends, sont aussi blocage, c'est-à-dire qu’ils sont volontaire multitâche, alors vous pouvez les utiliser, mais il devez gérer le contexte passe vous-même via `` . Threads peuvent être réellement ce dont vous avez besoin, mais je ne sais pas comment matures, elles sont en node.js.

2voto

genericdave Points 352

Dans de nombreux Nœud développeurs avis l'une des meilleures parties de Nœud est en réalité son single-threaded la nature. Fils d'introduire toute une série de difficultés avec des ressources partagées Nœud évite complètement en ne faisant rien, mais non bloquant IO.

Cela ne veut pas dire que le Nœud est limitée à un seul thread. C'est juste que la méthode pour obtenir filetée de simultanéité est différent de ce que vous cherchez. Le standard de la façon de traiter avec des fils est avec le cluster module est livré en standard avec le Nœud lui-même. C'est une approche plus simple de threads que manuellement les traiter dans votre code.

Pour traiter avec la programmation asynchrone dans votre code (en évitant imbriquée rappel des pyramides), la [Future] dans les Fibres de la bibliothèque est un choix décent. Je voudrais aussi vous suggère de vérifier Asyncblock qui est basé sur les Fibres. Les fibres sont bien car ils vous permettent de masquer rappel par la duplication de la pile et ensuite sauter entre les piles sur un seul thread comme ils sont nécessaires. Vous permet d'économiser les tracas de vrais fils tout en vous donnant les avantages. L'inconvénient est que les traces de pile peut être un peu bizarre lors de l'utilisation de Fibres, mais ils ne sont pas trop mauvais.

Si vous n'avez pas besoin de vous soucier de async choses et sont plus du tout intéressés à faire beaucoup de traitement sans blocage, un simple appel à des processus.nextTick(rappel) à chaque fois dans un certain temps est tout ce dont vous avez besoin.

1voto

kbjr Points 348

Peut-être certains plus d'informations sur les tâches que vous effectuez en aide. Pourquoi auriez-vous besoin d' (comme vous l'avez mentionné dans votre commentaire genericdave réponse) besoin de créer plusieurs milliers d'entre eux? La manière habituelle de faire ce genre de chose dans le Nœud est de lancer un processus de travail (à l'aide d'une fourchette ou une autre méthode) qui fonctionne toujours et peuvent être communiquées à l'aide de messages. En d'autres termes, ne pas commencer un nouveau travail à chaque fois que vous devez effectuer quelle que soit la tâche que vous êtes en train de faire, mais il suffit d'envoyer un message à la déjà en cours d'exécution travailleur et obtenir une réponse quand c'est fait. Honnêtement, je ne peux pas voir que le démarrage de plusieurs milliers de réels fils serait très efficace, vous êtes toujours limité par vous-Processeurs.

Maintenant, après avoir dit tout cela, je n'ai fait beaucoup de travail avec Crochet.io dernièrement qui semble fonctionner très bien pour ce genre de déchargement des tâches à d'autres processus, peut-être il peut accomplir ce que vous avez besoin.

-1voto

metadings Points 1705

Qu’en est-il à l’aide de setTimeout des vétérans de reporter (retard 1) la fonction de blocage ?

http://NodeJS.org/API/timers.html

N’est pas réel multi threading (V8 peut faire envoi je ne sais pas), mais c’est la façon javaScript est utilisé pour effectuer des tâches de blocage dans les navigateurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X