2011-08-11 5 views
5

J'ai un script python qui effectue des demandes d'URL en utilisant le urllib2. J'ai un pool de 5 processus qui fonctionnent de manière asynchrone et exécutent une fonction. Cette fonction est celle qui fait les appels d'url, obtient des données, les analyse dans le format requis, effectue des calculs et insère des données. La quantité de données varie pour chaque demande d'URL.Moniteur python processus bloqués

Je lance ce script toutes les 5 minutes en utilisant un travail cron. Parfois, quand je fais ps -ef | grep python, je vois des processus bloqués. Existe-t-il un moyen de suivre la signification des processus au sein de la classe multitraitement qui peut suivre les processus, leur signification d'état terminée, bloquée ou morte et ainsi de suite? Voici un extrait de code:

Voilà comment j'appelle les processus async

pool = Pool(processes=5) 
pool.apply_async(getData,) 

Et ce qui suit est une partie de getData qui effectue des demandes urllib2:

try: 
    Url = "http://gotodatasite.com" 

    data = urllib2.urlopen(Url).read().split('\n') 
except URLError, e: 
    print "Error:",e.code 
    print e.reason 
    sys.exit(0) 

est-il un moyen de suivre processus bloqués et les réexécuter?

+1

"coincé?" Pouvez-vous expliquer ce que cela signifie? –

+0

Pourquoi devez-vous les exécuter avec 'multiproccesing'? Quel est le problème avec l'utilisation de plusieurs tâches cron? –

+0

@Andrew: par coincé, je veux dire des processus accrochés. – ash

Répondre

1

Implémentez un mécanisme ping si vous êtes si enclin à utiliser le multitraitement. Vous êtes à la recherche de processus bloqués en raison des E/S lentes, je suppose?

Personnellement, j'aller avec une file d'attente (pas nécessairement un serveur de file d'attente ), disons par exemple ~/jobs est une liste d'URL à travailler, ont alors un programme qui prend le premier emploi et l'exécute. Ensuite, c'est juste une question de comptabilité - disons, notez le programme quand il a été lancé et quel est son PID. Si vous devez supprimer des tâches lentes, il suffit de supprimer le PID et de marquer le travail comme ayant échoué.

0

Google pour urllib2 et timeout. Si le délai d'attente est atteint, vous obtenez une exception et le processus n'est plus bloqué.