Lorsque le dormeur du fil parent fait que Sub threads dort aussi?
Maintenant le thread principal est UI Je crée 20 sous-threads à l'intérieur du fil principal avec une tâche usine (permet d'appeler les threads 2) À l'intérieur de cette 20 sous-threads, je crée à nouveau encore 10 sous-threads avec une sous-usine (permet d'appeler les threads 3) p>
maintenant à l'intérieur de ce fil 2 j'ai une boucle infinie. À l'intérieur de la boucle infinie vérifiant si les threads 3 complétés ou non. Si terminé, éliminez le thread terminé et démarrez un autre thread. J'utilise 250 ms dormir pour chaque vérification à l'intérieur infini tandis que la boucle. Donc, lorsque les threads 2 dans le sommeil se décharge également 3 du sommeil ou ils sont indépendants. Ici le code que vous pouvez voir. p>
5 Réponses :
Il n'y a pas de concept de fil de parents et d'enfants. Une implication de cela est que les fils d'enfants ne dorment pas lorsque le fil parent dort. P>
Merci de répondre. Je me demande juste ça. Cette approche est-elle bonne pour garder un certain nombre de threads vivants?
Pourquoi voulez-vous "garder un certain nombre de discussions vivantes"? Généralement, les threads vivent aussi longtemps qu'ils ont besoin de vivre pour faire leur travail.
C'est chencheur. Donc, je veux pouvoir mettre les agents de crawler compter.
Chaque thread est toujours totalement indépendant. La seule connexion possible entre les threads est que lorsque tous les fils de filetage sans fond, le programme se termine, de sorte que les fils de fond meurent. Si un fil dort, les autres threads continuent de travailler (et vont probablement plus vite, car il y a un travail de moins de fil). Si vous avez besoin de synchroniser des threads, il existe différentes classes pour le faire (dans des verrous généraux (pas une classe), des mutiles, des sémaphores ...) p>
Il n'y a pas de fil "parent" vraiment. Un fil commence un autre, mais il n'y a pas de relation particulière entre eux. Par exemple, le thread de départ peut se terminer sans aucun des nouveaux threads mourant. P>
Le fil de départ dormant définitivement n'affecte aucun autre fil. P>
Merci de répondre. Je me demande juste ça. Cette approche est-elle bonne pour garder un certain nombre de threads vivants?
@MONSTERMMORPG: Non ... Ne dites pas simplement les fils de dormir pour les raisons de "pendre" pour eux. Il existe des méthodes de mise en commun (voir MSDN: threadpool) qui permettent à votre application de «garder une poignée» sur un fil.
vous, mais la mise en commun ne vous permet pas de garder un certain nombre de discussions vivantes
@MONSTERMMORPG: Le point entier d'une piscine de thread est que fait i> un certain nombre de discussions vivantes en attendant plus de travail.
pouvez-vous me dire que comment allez-vous ramper 1 million d'URL avec piscine de fil
@MONSTERMMORPG: Si j'étais obligé de le faire sur une seule machine, j'utiliserais probablement une file d'attente de producteur / consommateur tel que le blocageCollection dans .NET 4.
Oui forcé sur un seul ordinateur. Mais comment allez-vous commencer les threads avec même en utilisant le blockingCollection? Combien de fil allez-vous commencer?
@ Monstermmorpg: Cela dépendrait du nombre de connexions réseau que je voulais avoir ouvert à la fois - ce qui dépendrait de ma connexion réseau elle-même, ainsi que des URL. (J'essaierais d'éviter d'avoir trop de connexions ouvertes à un seul hôte à la fois, par exemple.)
Pouvez-vous me dire que dans la piscine de fil, vous pouvez voir combien de threads fonctionnent. Vous donnez toujours des réponses non claires: D S'il y a une meilleure façon, je voudrais le déplacer.
N'a-t-elle pas 1 million de threads prenant plus de temps que de les avoir attendre comme le faisait monstre?
@Skuta: Qui a dit quelque chose d'environ un million de threads? J'ai dit que j'utiliserais une piscine de fil.
@Jonskeet n'est pas là différent entre les fils de premier plan et de fond? Je vois parfois des personnes de manière incorrecte de cette différence à l'aide de la terminologie des enfants / parents. docs.microsoft.com/en-us/ Dotnet / standard / filetage / ...
@Chieltenbrinke: premier plan / arrière-plan n'est pertinent que pour savoir si un thread conserve le processus vivant. C'est complètement orthogonal à tout concept de "parent / enfant".
Thread.Sleep(...) only suspends the current Thread.check here: Thread.Sleep Methodso all other threads will keep working.
Les autres ont raison, il n'y a pas de concept de "threads parent" dans .NET. Et attendre sur un thread ne cause pas d'autres threads à attendre (sauf s'il y a une certaine synchronisation impliquée, comme en utilisant Mais il y a un autre point: votre code ne crée pas de nouveaux threads, du moins pas nécessairement. Lorsque vous appelez verrouillage code> s). P>
Task.Factory.StartNew () code>, la tâche est généralement programmée sur un fil de piscine de thread. S'il n'y a pas de fil disponible et que le nombre de threads n'a pas encore atteint le nombre maximal autorisé, le nouveau thread est créé em> créé. Mais dans d'autres cas, ce n'est pas le cas. La tâche consiste à réutiliser le fil de ralenti existant ou à attendre, jusqu'à ce que l'on soit disponible. P>
S'il vous plaît ne mettez pas tous de "WPF - TPL - C # 4.0" dans vos titres. Utilisez des balises pour cela.
Tout d'abord, cela ressemble à une architecture très thread-lourde; Êtes-vous sûr d'avoir besoin de tous ces threads? À tout moment, vous gaspillez un fil entier qui est juste assis là-bas, la plupart du temps est un très mauvais signe; Vous n'allouiez pas allouer un million d'octets et ne rien mettre de nouveau rien, mais c'est exactement ce que vous faites lorsque vous faites un fil de ralenti. Deuxièmement, je ne comprends pas pourquoi vous posez la question ici. Vous avez déjà écrit le code; Il suffit de l'exécuter et de voir ce que ça fait. I> Si les threads "Enfant" ne vont pas dormir, vous saurez la réponse.
Eric Lippert Je demande également à l'approche de garder un certain nombre de threads en vie tout le temps.
Dormir est un moyen boiteux d'attendre. Utilisez une fonction d'attente appropriée.
Cela semble trop complexe pour un robot. Créez une liste de tâches et jetez-le sur un pool de fils.
David Heffernan Qu'est-ce que la fonction d'attente appropriée?
Le point de David est qu'il y a lots b> de façons de faire attendre un fil sur un autre. Utilise les! C'est bien mieux que ce système fou de dormir pendant un moment, se réveiller, retourner au sommeil, se réveiller ... à la place, faites un objet qui signale des fils, avez un fil d'attente pour le signal et un autre thread activé le signal. Laisser le système d'exploitation traiter avec la gestion du fil; Vous n'avez pas à faire tout ce genre de choses. Chaque fois que vous voyez que quelqu'un appelle dormir sur un thread devrait agiter un grand drapeau rouge qui dit: "Ce gars gère non efficacement ses discussions". Il y a une meilleure façon.
Pour conserver un certain nombre de threads vivants pour une utilisation ultérieure, ne le faites pas vous-même b>. Utilisez une piscine de fil. C'est ce que c'est pour. Basé sur votre question, cela ressemble à (1) Vous n'avez pas beaucoup d'expérience de travail avec des threads, et (2) vous essayez de réinventer un tas de technologies qui existe déjà et a été soigneusement adaptée par des experts. Vous utilisez la bibliothèque parallèle de tâche pour représenter votre problème que je vois, alors laissez-le cela i> vous inquiétez de déterminer le nombre de fils à créer pour résoudre le problème le plus efficacement.
Pouvez-vous me dire que comment allez-vous faire un filetage qui rampera 1 million d'URL? Je me demande vraiment de votre approche.