我正在尝试使用大约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
截至目前,我将尝试使用较少的项目运行脚本以查看是否可以解决问题。但是,必须有更好的方法来做到这一点。我真的很想学习。
感谢您的时间。
答案 0 :(得分:0)
看起来你正在打开文件描述符限制(ulimit -n),这可能是1024。 每个新的getPage调用都会打开一个新的文件句柄,该句柄映射到为HTTP请求打开的客户端TCP套接字。您可能希望限制并发运行的getPage调用量。另一种方法是提高进程的文件描述符限制,但如果self.book超过32K项,你可能仍会耗尽端口或FD。