Twisted getPage, exceptions.OSError: [Errno 24] Too many open files

Twisted getPage, exceptions.OSError: [Errno 24] Too many open files

我正在尝试 运行 包含大约 3000 个项目的以下脚本。该脚本采用 self.book 提供的 link 和 returns 使用 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

现在,我将尝试 运行 脚本中的项目较少,看看是否可以解决问题。但是,一定有更好的方法来做,我真的很想学习。

感谢您的宝贵时间。

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