如,一个将数据保存到excel文件的管道类,作为一个通用类,不写死Item类的判断过程,用dict来map类名和文件的关系,
outputs = {‘AAAAAItem’: dict(wb=wb, ws=ws), 'BBBBBItem': dict(wb=wb, ws=ws), ...}
所以对于这个dict来说,只有来了一个新的没见过的Item实例才会初始化与之对应的文件。
def process_item(self, item, spider):
output = self.outputs.get(item.item_name) # item_name换成type(item)也可以哈哈,一样滴
if not output:
# create file
# ...
output = dict(wb=wb, ws=ws)
self.outputs[item.item_name] = output
output['ws'].append([...])
return item
那么问题来了,Item们并发怼到这个pipeline里,在第一次的创建文件的过程中,会有线程安全之类的问题吗?要加个双重检验锁咩?(懒得看它的源码是怎么调pipeline&自己些测试)
Python
Scrapy
试了下,发现文件里有几行表头,是有线程安全问题的,还是要加个锁的哈哈哈哈哈哈哈哈,自己答了。。。