Python多处理模块不起作用

时间:2016-02-18 10:50:05

标签: python gevent

我正在尝试用多处理模块

编写一个蜘蛛

这是我的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

也许这是我的过程方式错误 每次运行此代码时,我的流程都会告诉我

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

希望爱它

1 个答案:

答案 0 :(得分:2)

这里的主要问题是您没有关于为什么您的流程失败的任何信息。它可能是gevent,但它可能很容易成为别的东西。因此,了解流程终止的实际原因是做其他事情之前的第一步。

您需要的是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')

此代码的作用:

  1. 创建一个特殊的记录器,将其传递给主进程并将其转储到stderr(默认情况下为控制台)。
  2. 配置此记录器报告所有内容,包括一些内部multiprocessing模块事件(以防您可能不需要它们)。
  3. 将你的整个代码包含在无所不包的声明中,这样无论发生什么都无法逃脱你的注意。
  4. 在记录器上运行.exception()方法,它不仅记录消息(因为我们不知道实际发生了什么,它无意义)但最重要的是记录整个错误追溯 - 我们确实需要。