Я пытаюсь запустить следующий скрипт, содержащий около 3000 элементов. Сценарий берет ссылку, предоставленную self.book
, и возвращает результат, используя getPage
. Он перебирает каждый элемент в self.book
, пока в словаре больше нет предметов.Twisted getPage, exceptions.OSError: [Errno 24] Слишком много открытых файлов
Вот сценарий:
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
Как прямо сейчас, я буду стараться, чтобы запустить сценарий с меньшим количеством элементов, чтобы увидеть, если который решает проблему. Тем не менее, должен быть лучший способ сделать это. & Мне очень хотелось бы узнать.
Спасибо за ваше время.
Можете ли вы дать определение для 'getPage'? Похоже, вы не разбираетесь в чем-то чисто. – jozzas
Вот документация для [getPage] (http://twistedmatrix.com/documents/current/api/twisted.web.client.getPage.html). Это то, что вы имели ввиду? – Tyler
Ах, да, да! Я думаю, что это будет связано с тем, что вы создадите все свои отложенные события за один раз - я бы имел ~ 5-10 активных одновременно и создавал новые в pageCallback по мере их завершения. Я думаю, что вы исчерпываете количество одновременных соединений, с которыми будет работать ваша ОС. Это также менее вероятно, чтобы быть эффективным решением. – jozzas