2010-01-26 4 views
8

J'ai mis en place un processus qui lit une file d'attente pour les URL entrantes à télécharger mais quand urllib2 ouvre une connexion, le système se bloque. D'un autre module, je peux ajouter des URL et quand je veux, je peux arrêter le processus et attendre la fermeture du processus.Processus Python bloqué par urllib2

import module 

module.url_queue.put('http://foobar1') 
module.url_queue.put('http://foobar2') 
module.url_queue.put('http://foobar3') 
module.url_queue.put('STOP') 
downloader.download_worker.join() 

Le problème est que lorsque j'utilise urlopen ("réponse = urllib2.urlopen (demande)"), il reste tout bloqué.

Il n'y a pas de problème si j'appelle la fonction download() ou lorsque je n'utilise que des threads sans Processus.

Répondre

4

Le problème ici n'est pas urllib2, mais l'utilisation du module multi-traitement. Lorsque vous utilisez le module multitraitement sous Windows, vous ne devez pas utiliser de code qui s'exécute immédiatement lors de l'importation de votre module - placez plutôt les éléments dans le module principal à l'intérieur d'un bloc if __name__=='__main__'. Voir la section "Importation en toute sécurité du module principal" here.

Pour votre code, faire ce changement suivant dans le module downloader:

#.... 
def start(): 
    global download_worker 
    download_worker = Process(target=downloader, args=(url_queue, page_queue)) 
    download_worker.start() 

Et dans le module principal:

import module 
if __name__=='__main__': 
    module.start() 
    module.url_queue.put('http://foobar1') 
    #.... 

Parce que vous ne le faites pas, chaque fois que le sous-processus était commencé à exécuter le code principal à nouveau et commencer un autre processus, provoquant le blocage.

+0

Je n'utilise pas Windows mais votre suggestion d'utiliser une fonction start() résout le problème. Merci! – Davmuz

Questions connexes