le multithreading ou multitraitement
Je suis en train de concevoir un dédié syslog-traitement démon pour Linux qui doit être robuste et évolutive, et je me débats multithread vs multi process.
L'objection évidente avec le multithreading est de la complexité et de méchants bugs.
Multi-processus peut influer sur les performances en raison de l'IPC, des communications et de la commutation de contexte.
"The Art of Unix Programming" explique cette ici.
Recommanderiez-vous à un processus système (comme Apache) ou d'un multi-thread approche?
Je ne suis pas sûr de vous donner assez d'information au sujet de votre objectif/exigences à proposer un avis sur ce
Apache n'est pas necesseraly multi-thread ou multi-processus. Vous pouvez le compiler afin qu'il utilise l'un de ces modèles. Il peut même travailler dans aucun de ceux-ci. Bien que je n'ai pas vu utilisé compilé en mode asynchrone, il peut fonctionner de cette façon.
Apache n'est pas necesseraly multi-thread ou multi-processus. Vous pouvez le compiler afin qu'il utilise l'un de ces modèles. Il peut même travailler dans aucun de ceux-ci. Bien que je n'ai pas vu utilisé compilé en mode asynchrone, il peut fonctionner de cette façon.
OriginalL'auteur pinto | 2009-03-22
Vous devez vous connecter pour publier un commentaire.
Deux d'entre eux peuvent être compliquées et complexes dans leurs propres moyens.
Vous pouvez le faire. Dans le grand schéma des choses, il ne serait pas question que vous choisissez. Ce qui importe est la façon dont vous le faites. Donc:
Faire ce que vous êtes plus expérimenté.
Ou si votre tête d'une équipe, est-ce que l'équipe est plus expérimenté.
---Threading!---
J'ai fait beaucoup de filetée de la programmation, et je profiter de parties de celui-ci, et une partie que je n'apprécie pas. J'ai appris beaucoup de choses, et maintenant vous pouvez l'habitude d'écrire une application multi-thread sans trop de douleur, mais il doit être écrit dans une manière très spécifique. À savoir:
1) Il doit être écrit avec très clairement défini les limites de données qui sont 100% thread-safe. Sinon, n'importe quelle condition qui peut arriver, va arriver, et il peut ne pas l'être quand vous avez un débogueur autour de la pose.. Plus de débogage fileté code, c'est comme regarder dans le chat de Schrödinger boîte... en regardant Par-là, les autres threads peuvent ou peuvent ne pas avoir eu le temps de traitement de plus.
2) Il doit être écrit avec des tests de code sur la machine. De nombreux multi-thread pour les systèmes à montrer leurs bugs, lorsque les machines sont fortement souligné.
3) Il doit y avoir une personne très intelligente qui est le propriétaire des données l'échange de code. Si il n'y a aucune façon pour un raccourci, certaines développeur va probablement le faire, et vous aurez un errant bug.
4) Il y a à être fourre-tout, des situations qui permettra de réinitialiser l'application avec un minimum de tracas. C'est pour le code de production qui se brise à cause de certain problème thread. En bref: Le spectacle doit continuer.
---Croix -! - - -
J'ai moins d'expérience avec les processus les threads, mais ont récemment fait quelques croix-processus de trucs dans Windows (où l'IPC est d'appels de service web... WOO!), et c'est relativement propre et simple, mais j'suivre quelques règles ici. En gros, la communication interprocessus sera beaucoup plus sans erreur parce que les programmes de recevoir les commentaires du monde extérieur très bien.. et ces mécanismes de transport sont généralement asynchrone. De toute façon...
1) Définir clairement les limites des processus et des mécanismes de communication. Message/concours complet via, oh dis, TCP ou des services web ou des tuyaux ou tout ce qui est bien, aussi longtemps que les frontières sont claires, et il y a beaucoup de validation et de vérification des erreurs de code à ces frontières.
2) Être préparé pour les goulets d'étranglement. Code le pardon est très important. Par cela, je veux dire, parfois, vous ne serez pas en mesure d'écrire sur ce canal. Vous devez être en mesure de requeue et de réessayer de les messages sans le verrouillage de l'application en haut/en lançant une exception.
3) Il y aura beaucoup plus de code, en général, parce que le transport de données dans les limites du processus signifie que vous avez à sérialiser d'une certaine façon. Cela peut être une source de problèmes, en particulier lorsque vous démarrez le maintien et l'évolution de ce code.
Espère que cette aide.
OriginalL'auteur Lomilar
Dépend de ce langage de programmation que vous souhaitez utiliser (et des bibliothèques).
Personnellement je choisirais le multithreading, comme je connais les problèmes associés avec les threads (et la façon de les résoudre).
Multitraitement pourrait vous aider si vous souhaitez exécuter le démon sur plusieurs machines et de distribuer la charge entre eux, mais je ne pense pas que c'est un problème majeur ici.
OriginalL'auteur tstenner
Vous avez laissé trop de détails. En fait, en termes de ce que vous avez déjà dit, le choix n'est pas pertinent et il n'y a rien d'intrinsèquement plus buggé sur le multithreading de multitraitement; vous êtes absent pourquoi ces techniques ont une telle réputation. Si vous n'êtes pas le partage de données, il n'y a pas trop de problème à être avait (bien sûr, il y a peut être d'autres problèmes, mais nous avons besoin de détails pour décider à propos de ceux-ci). Aussi, il importe quel plate-forme, sur des systèmes d'exploitation UNIX, les processus sont assez léger tout de même.
Cependant, il y a d'autres problèmes à prendre en compte? Ce type de système(s) allez-vous être en cours d'exécution? Vous ne voulez certainement pas à pondre plusieurs processus sur un système monoprocesseur que vous n'allez pas obtenir beaucoup d'avantages, selon quelques autres détails, vous pouvez spécifier. Si vous décrivez la nature du problème que vous essayez de résoudre, nous pouvons aider les autres.
OriginalL'auteur BobbyShaftoe
Si vous voulez la robustesse, l'utilisation de multi-traitement.
Le processus de partage de l'enregistrement de la charge entre eux. Tôt ou tard, un enregistrement demande sera frappé d'un bug et crash de l'enregistreur. Avec le multi-traitement, vous perdez seulement un processus, et ainsi seulement que l'on journalisation demande (vous ne pouvez pas avoir manipulé de toute façon, à cause du bug).
Multi-threading est vulnérable aux accidents, depuis la mort d'un homme bug a votre processus unique.
Mulit-traitement est à certains égards plus techniquement difficile, car vous devez équilibrer la charge de travail sur les processus, ce qui peut impliquer l'utilisation de la mémoire partagée.
OriginalL'auteur
Avez-vous besoin de partager des données mises à jour entre le cas où les mises à jour sont fréquentes et IPC serait trop cher? Dans ce cas, le multithreading est probablement mieux. Sinon, vous devez évaluer si la robustesse des processus distincts ou la facilité de création de thread/communication le plus important pour vous.
OriginalL'auteur Mark Probst
Question est de savoir si il est nécessaire de le faire. Je ne connais pas les détails de vos exigences, mais un seul thread application à l'aide de
select(2)
peut s'adapter à vos besoins et ne pas avoir les inconvénients de n'importe quel processus ou threads. Cela exige que vous soyez en mesure de centraliser tous vos I/O dans un emplacement central, le plus probable d'envoi à d'autres modules via des rappels, mais ce n'est pas difficile, sauf si vous avez beaucoup de bibliothèques qui veulent faire leur propre I/O et ne peut pas être restructuré de cette façon.OriginalL'auteur Brian Campbell
Merci à tous pour vos commentaires.
J'ai décidé sur un multi-architecture de processus, semblable au serveur web Apache.
Le processus de mise à l'échelle bien sur multi-processeur/systèmes de base.
Les Communications seront effectuées avec des tuyaux ou des sockets.
Processus sera prêt à être utilisé dans un processus de-piscine donc il n'y a pas de processus de frai coût.
L'impact sur les performances est négligeable en comparaison de la robustesse je vais gagner.
OriginalL'auteur pinto
Bien, nous avons finalement mis en œuvre comme un multi-système de traitement avec des tuyaux pour l'IPC et un comptable qui engendre des processus au besoin. Semblable à l'Apache httpd. Il fonctionne parfaitement.
OriginalL'auteur pinto