Question

Un script web crawler qui fraie dans la plupart des 500 threads et chaque thread demande essentiellement pour certaines données ont servi à partir du serveur distant, qui la réponse de chaque serveur est différent dans le contenu et la taille des autres.

Je mise stack_size comme pour les fils de 756K

threading.stack_size(756*1024)

ce qui me permet d'avoir le nombre de threads suffisant requis et terminer la plupart des emplois et des demandes. Mais comme certaines réponses des serveurs sont plus grandes que les autres, et quand un thread obtient ce genre de réponse, le script meurt avec SIGSEGV.

stack_sizes plus de 756K rend impossible d'avoir le nombre requis de threads en même temps.

des suggestions sur comment puis-je continuer avec stack_size donné sans accidents? et comment puis-je obtenir le stack_size courant utilisé d'un thread donné?

Était-ce utile?

La solution

Pourquoi sur la terre vous fraie 500 fils? Cela semble être une idée terrible!

Supprimer le filetage complètement, utilisez une boucle d'événement pour faire le rampants. Votre programme sera plus rapide, plus simple et plus facile à maintenir.

Beaucoup de threads en attente pour le réseau ne fera pas votre programme attendre plus rapide . Au lieu de cela, recueillir tous les sockets ouverts dans une liste et exécuter une boucle où vous vérifier si l'un d'entre eux a des données.

Je recommande d'utiliser Twisted - Il est un moteur de mise en réseau événementiel. Il est très flexile, sécurisée, évolutive et très stable (pas segfaults).

Vous pouvez également jeter un oeil à Scrapy - Il est un cadre web et rampants grattage écran écrit en Python / Twisted . Il est encore en cours de développement, mais peut-être vous pouvez prendre quelques idées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top