2015-01-27 2 views
1

Я пытаюсь запустить следующий скрипт, содержащий около 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 

Как прямо сейчас, я буду стараться, чтобы запустить сценарий с меньшим количеством элементов, чтобы увидеть, если который решает проблему. Тем не менее, должен быть лучший способ сделать это. & Мне очень хотелось бы узнать.

Спасибо за ваше время.

+0

Можете ли вы дать определение для 'getPage'? Похоже, вы не разбираетесь в чем-то чисто. – jozzas

+0

Вот документация для [getPage] (http://twistedmatrix.com/documents/current/api/twisted.web.client.getPage.html). Это то, что вы имели ввиду? – Tyler

+0

Ах, да, да! Я думаю, что это будет связано с тем, что вы создадите все свои отложенные события за один раз - я бы имел ~ 5-10 активных одновременно и создавал новые в pageCallback по мере их завершения. Я думаю, что вы исчерпываете количество одновременных соединений, с которыми будет работать ваша ОС. Это также менее вероятно, чтобы быть эффективным решением. – jozzas

ответ

0

Похоже, вы попадаете в ограничение дескрипторов открытых файлов (ulimit -n), которое, вероятно, будет 1024. Каждый новый вызов getPage открывает новый дескриптор файла, который сопоставляется с клиентским TCP-сокетом, открытым для HTTP-запроса. Вы можете ограничить количество вызовов getPage, которые вы запускаете одновременно. Еще один способ - увеличить лимит дескриптора файла для вашего процесса, но тогда вы все равно можете исчерпать порты или FD, если self.book растет за пределами 32K элементов.

Смежные вопросы