我正在开发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