我正在開發scrapy蜘蛛,它正在成功生成一些項目。這些項目應該使用pymysql插入到數據庫中。因爲數據是關係型的,所以我必須執行一些插入語句。 我想在每次整個插入之後調用connection.commit()
以確保發生錯誤不會導致數據庫中的不一致條目。Scrapy項目流水線並行或順序執行process_item
我目前想知道scrapy是否會爲多個項目並行調用process_item
,或者爲一個接一個項目順序調用。如果是後者的話,我可以簡單地用下面的辦法:
def process_item(self, item, spider):
# execute insert statements
connection.commit()
如果不止一個呼叫process_item
在由scrapy同時執行,在月底commit()
呼叫可以被稱爲而另一項目未完全插入。
的documentation for item pipelines狀態:
後的物品已被蜘蛛刮下,它被髮送到項目管道,其處理它通過依次執行幾個組件。
但我不能肯定這是否意味着process_item
絕不會並行執行,或丟棄重複只是不同的管道將總是一個接一個執行(例如 - >更改的東西 - > dB的插入)。
我認爲process_item
會按順序執行,如文檔示出了下面的示例:
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
在該代碼中,有添加的id來ids_seen
涉及,不過我不沒有同步不知道這個例子是否簡化,因爲它只演示瞭如何使用管道。
謝謝,不知何故,我沒有看到這個選項! – Alex