2017-08-02 6 views
1

Ich entwickle eine Scrapy Spider, die erfolgreich einige Elemente liefert. Diese Elemente sollten mithilfe von pymysql in eine Datenbank eingefügt werden. Da die Daten relational sind, muss ich für jedes Element einige Einfügeanweisungen ausführen. Ich möchte connection.commit() nach jeder vollständigen Einfügung aufrufen, um sicherzustellen, dass auftretende Fehler keine inkonsistenten Einträge in meiner Datenbank verursachen.Scrapy Item Pipelines parallele oder sequentielle Ausführung von process_item

Ich frage mich derzeit, ob scrapy parallel für mehr als ein Element oder nacheinander für ein Element nach dem anderen aufrufen wird. Wenn letzteres der Fall ist, könnte ich einfach die folgende Methode verwenden:

def process_item(self, item, spider): 
    # execute insert statements 
    connection.commit() 

Wenn mehr als ein Aufruf an process_item zugleich von scrapy ausgeführt wird, kann der Anruf an commit() am Ende, während ein anderer genannt werden Artikel ist nicht vollständig eingefügt.

Die documentation for item pipelines Zustände:

Nachdem ein Artikel von einer Spinne abgeschabt worden ist, wird es an die Artikel-Pipeline gesendet, die es durch mehrere Komponenten verarbeitet, die sequentiell ausgeführt werden.

Aber ich bin nicht ganz sicher, ob das bedeutet, dass process_item nie parallel ausgeführt werden, oder einfach nur, dass verschiedene Pipelines würde immer einer nach dem anderen ausgeführt werden (zB Dubletten Dropping -> Ändern etwas -> DB Insertion).


Ich denke, dass process_item sequenziell ausgeführt werden, da die Unterlagen über das folgende Beispiel zeigt:

class DuplicatesPipeline(object): 

def __init__(self): 
    self.ids_seen = set() 

def process_item(self, item, spider): 
    if item['id'] in self.ids_seen: 
     raise DropItem("Duplicate item found: %s" % item) 
    else: 
     self.ids_seen.add(item['id']) 
     return item 

In diesem Code gibt es keine Synchronisation für das Hinzufügen der ID ids_seen beteiligt, doch ich don Ich weiß nicht, ob das Beispiel vereinfacht ist, weil es nur zeigt, wie Pipelines zu verwenden sind.

Antwort

1

Die Dokumentation für die Einstellung CONCURRENT_ITEMS gibt an, dass Elemente parallel verarbeitet werden (mindestens innerhalb einer einzigen Antwort). Ich denke, es 1 setzen könnte in Ihrem Fall helfen.

Ich bin kein Experte für diesen Teil von Scrapy, aber ich glaube, this is where it happens.

+0

Danke, irgendwie habe ich diese Option nicht gesehen! – Alex

Verwandte Themen