2017-02-22 6 views
0

Ich habe ein Scrapy-Projekt bereitgestellt, die kriecht, wenn ein Lambda API Anforderungen kommt.Scrapy wirft Fehler ReactorNotRestartable beim Ausführen auf AWS Lambda

Es läuft perfekt für die erste API-Aufruf, aber später schlägt es fehl und wirft ReactorNotRestartable Fehler.

Soweit ich das verstehen kann, wird das AWS Lambda-Ökosystem den Prozess nicht töten, daher ist der Reaktor immer noch im Speicher vorhanden.

Die Lambda-Protokollfehler ist wie folgt:

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 

Die Lambda-Handler-Funktion ist:

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

I eine Abhilfe hatte durch den Reaktor nicht zu stoppen, indem ein Flag in der Startfunktion Einfügen

process.start(stop_after_crawl=False) 

Aber das Problem mit diesem war, dass ich warten musste, bis der Lambda-Aufruf Tim raus.

Andere Lösungen versucht, aber keiner von ihnen scheint zu funktionieren.Kann mir jemand Anleitung, wie man dieses Problem lösen.

+0

Huh. Lambda verwendet Ihren Python-Prozess erneut, um mehrere Ereignisse zu verarbeiten? Und Ihr Handler muss synchron sein? –

+0

@firefox Seit Sie die Frage als gelöst markiert haben. Können Sie beschreiben, wie Sie mit Häkeln Ihr Problem gelöst haben? – Hugo

+0

@firefox Ich habe eine harte Zeit versucht, scrapy in einem aws Lambda zu laufen .. Wie hast du deine Zip-Datei erstellt? Ich habe einen 'ImportError: Name kann nicht importiert werden 'etree'' –

Antwort

0

Sie könnten versuchen, https://pypi.python.org/pypi/crochet zu verwenden, um die Verwendung eines Reaktors zu koordinieren, der in einem Nicht-Hauptfaden vom Lambda-gesteuerten Hauptfaden läuft.

Häkeln wird die Gewinde-Reaktor-Initialisierung für Sie tun und bietet Tools, um es einfach zu machen, Code im Reaktor Thread von der Haupt-Aufruf (und erhalten Sie die Ergebnisse).

Dies entspricht eher den Erwartungen, die Lambda an Ihren Code stellt.

1

Dieses Problem betrifft nicht AWS Lambda - siehe running a spider in a Celery task.

Sie könnten versuchen ScrapyScript (Offenlegung: Ich schrieb es). Es erzeugt einen Unterprozess, um den Twisted-Reaktor zu unterstützen, Blöcke, bis alle gelieferten Spinnen beendet sind, und dann austritt. Es wurde mit Sellerie geschrieben, aber der Anwendungsfall ist ähnlich.

In Ihrem Fall sollte diese Arbeit:

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

Unvorsichtige Kombination von Twisted- und Multi-Processing-Ergebnissen in bizarren, schwer zu debuggenden Fehlern. Zum Beispiel - http://stackoverflow.com/questions/42347121/why-i-am-getting-sigchldwaker-object-has-no-attribute-dowrite-in-scrapy - behandelt ScrapyScript solche Dinge? –

+0

@jschnurr Ich habe einen anderen Fehler mit scrapy auf Lambda "Modul Initialisierung Fehler: 'twisted.internet.reactor'" Ich habe Scrapyscript ohne Erfolg versucht. Hast du irgendwelche Gedanken zu diesem Thema? – Hugo

Verwandte Themen