2016-02-18 1 views
0

je suis en train d'écrire une araignée avec multitraitement ModuleModule Python multitraitement ne fonctionne pas

voici mon code python:

# -*- coding:utf-8 -*- 

import multiprocessing 
import requests 


class SpiderWorker(object): 


    def __init__(self, q): 
     self._q = q 

    def run(self): 

     def _crawl_item(url): 
      requests.get("http://www.baidu.com") 
      if respon.ok: 
       print respon.url 

     while True: 
      rst = self._q.get() 
      _crawl_item(rst) 


def general_worker(): 

    q = multiprocessing.Queue() 

    CPU_COUNT = multiprocessing.cpu_count() 

    worker_processes = [ 
     multiprocessing.Process(target=SpiderWorker(q).run) 
     for i in range(CPU_COUNT) 
    ] 

    map(lambda process: process.start(), worker_processes) 

    return q, worker_processes 

peut-être est ma mauvaise façon à chaque fois de processus je cours ce code, mon processus me dire

<Process(Process-1, stopped[SIGSEGV])> 

espoir aimer

+0

Désolé de harceler, mais cinq jours se sont écoulés et il n'y a aucune réaction de votre part. Avez-vous réussi à résoudre le problème vous-même? Si non, alors avez-vous identifié la raison réelle pour laquelle vos processus échouent? – Lav

Répondre

2

Le problème majeur ici est que vous n'avez aucune information sur pourquoi vos processus échouent. Ça pourrait être un gevent, mais ça pourrait tout aussi bien être autre chose. Donc, apprendre la raison réelle pour laquelle vos processus se terminent est la première étape avant de faire quoi que ce soit d'autre.

Qu'est-ce que vous avez besoin est multiprocessing.log_to_stderr():

class SpiderWorker(object): 
    # ... 
    def run(self): 
     logger = multiprocessing.log_to_stderr() 
     logger.setLevel(multiprocessing.SUBDEBUG) 
     try: 
      # Here goes your original run() code 
     except Exception: 
      logger.exception('whoopsie') 

Qu'est-ce que ce code fait:

  1. Crée un enregistreur spécial qui transmet ses informations au processus principal et le jeter à stderr (console par défaut).
  2. Configure cet enregistreur pour rapporter tout, y compris certains événements internes du module multiprocessing (juste au cas où vous n'en auriez probablement pas besoin).
  3. Enveloppe votre code entier dans une déclaration fourre-tout afin que quoi qu'il arrive, il ne peut pas échapper à votre avis.
  4. Exécute la méthode .exception() sur l'enregistreur, qui enregistre non seulement le message (ce qui n'a pas de sens car nous ne savons pas ce qui se passe réellement), mais surtout journalise l'ensemble de la trace d'erreur dont nous avons réellement besoin.