Twisted getPage,exceptions.OSError:[Errno 24]打开的文件太多

时间:2015-01-27 02:35:18

标签: python-2.7 twisted

我正在尝试使用大约3000个项目运行以下脚本。该脚本采用self.book提供的链接,并使用getPage返回结果。它遍历self.book中的每个项目,直到字典中没有其他项目为止。

这是脚本:

from twisted.internet import reactor
from twisted.web.client import getPage
from twisted.web.error import Error
from twisted.internet.defer import DeferredList

import logging
from src.utilitybelt import Utility

class getPages(object):
    """ Return contents from HTTP pages """

    def __init__(self, book, logger=False):
        self.book = book
        self.data = {}
        util = Utility()
        if logger:
            log = util.enable_log("crawler")

    def start(self):
        """ get each page """
        for key in self.book.keys():
            page = self.book[key]
            logging.info(page)

            d1 = getPage(page)

            d1.addCallback(self.pageCallback, key)
            d1.addErrback(self.errorHandler, key)
            dl = DeferredList([d1])

        # This should stop the reactor
        dl.addCallback(self.listCallback)

    def errorHandler(self,result, key):
        # Bad thingy!
        logging.error(result)
        self.data[key] = False
        logging.info("Appended False at %d" % len(self.data))

    def pageCallback(self, result, key):
        ########### I added this, to hold the data:
        self.data[key] = result
        logging.info("Data appended")
        return result

    def listCallback(self, result):
        #print result
        # Added for effect:
        if reactor.running:
            reactor.stop()
            logging.info("Reactor stopped")

大约一半时间,我遇到了这个错误:

 File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py",       line 303, in _handleSignals

 File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 205, in __init__

 File "/usr/lib64/python2.7/site-packages/twisted/internet/posixbase.py", line 138, in __init__

exceptions.OSError: [Errno 24] Too many open files
libgcc_s.so.1 must be installed for pthread_cancel to work
libgcc_s.so.1 must be installed for pthread_cancel to work

截至目前,我将尝试使用较少的项目运行脚本以查看是否可以解决问题。但是,必须有更好的方法来做到这一点。我真的很想学习。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

看起来你正在打开文件描述符限制(ulimit -n),这可能是1024。 每个新的getPage调用都会打开一个新的文件句柄,该句柄映射到为HTTP请求打开的客户端TCP套接字。您可能希望限制并发运行的getPage调用量。另一种方法是提高进程的文件描述符限制,但如果self.book超过32K项,你可能仍会耗尽端口或FD。