2017-02-22 47 views
0

Я развернул проект scrapy, который сканирует всякий раз, когда приходит запрос лямбда-апи.Ошибка сбрасывания Scrapy ReactorNotRestartable при запуске на AWS Lambda

Он отлично работает для первого вызова api, но позже он терпит неудачу и выдает ошибку ReactorNotRestartable.

Насколько я понимаю, экосистема AWMS Lambda не убивает процесс, поэтому реактор все еще присутствует в памяти.

ошибка журнала

лямбды выглядит следующим образом: функция обработчика

Traceback (most recent call last): 
File "/var/task/aws-lambda.py", line 42, in run_company_details_scrapy 
process.start() 
File "./lib/scrapy/crawler.py", line 280, in start 
reactor.run(installSignalHandlers=False) # blocking call 
File "./lib/twisted/internet/base.py", line 1242, in run 
self.startRunning(installSignalHandlers=installSignalHandlers) 
File "./lib/twisted/internet/base.py", line 1222, in startRunning 
ReactorBase.startRunning(self) 
File "./lib/twisted/internet/base.py", line 730, in startRunning 
raise error.ReactorNotRestartable() 
ReactorNotRestartable 

лямбды является:

def run_company_details_scrapy(event, context): 
    process = CrawlerProcess() 
    process.crawl(CompanyDetailsSpidySpider) 
    process.start() 

Я имел обходной путь, не остановки реактора путем вставки флага в функции запуска

process.start(stop_after_crawl=False) 

Но проблема заключалась в том, что мне пришлось ждать, пока лямбда-вызов tim .

Пробовал другие решения, но ни один из них не работает. Может ли кто-нибудь вести меня, как решить эту проблему.

+0

Ха. Lambda повторно использует ваш процесс Python для обработки нескольких событий? И ваш обработчик должен выполнить синхронно? –

+0

@firefox Поскольку вы отметили вопрос как решенный. Можете ли вы описать, как вы использовали вязание крючком для решения вашей проблемы? – Hugo

+0

@firefox Мне тяжело пытаться запустить scrapy в aws lambda .. как вы создали свой zip-файл? У меня есть «ImportError: не могу импортировать имя» etree'' –

ответ

0

Вы можете попытаться использовать https://pypi.python.org/pypi/crochet для координации использования реактора, работающего в основном потоке, из основного потока, управляемого Lambda.

Вязание крючком для инициализации резьбового реактора для вас и предоставляет инструменты, позволяющие легко вызвать код в потоке реактора из основного (и получить результаты).

Это может быть больше в соответствии с ожиданиями Lambda вашего кода.

1

Эта проблема не уникальна для AWS Lambda - см. running a spider in a Celery task.

Вы можете попробовать ScrapyScript (раскрытие: Я написал). Он запускает подпроцесс для поддержки реактора Twisted, блокируется до тех пор, пока все предоставленные пауки не закончат, а затем выйдет. Это было написано с сельдерием в виду, но прецедент аналогичен.

В вашем случае, это должно работать:

from scrapyscript import Job, Processor 
def run_company_details_scrapy(event, context): 
    job = Job(CompanyDetailsSpidySpider()) 
    Processor().run(job)` 
+0

Небрежное сочетание результатов Twisted и multi-processing приводит к причудливым ошибкам с отладчиком. Например: http://stackoverflow.com/questions/42347121/why-i-am-getting-sigchldwaker-object-has-no-attribute-dowrite-in-scrapy - делает ли ScrapyScript такие вещи? –

+0

@jschnurr У меня есть другая ошибка, использующая scrapy on lambda «ошибка инициализации модуля:« twisted.internet.reactor »« Я пробовал scrapyscript без успеха. У вас есть мысли по этому вопросу? – Hugo