Scrapy项管道中Python集合的线程安全问题(使用Twisted实现并发)

Scrapy项管道中Python集合的线程安全问题(使用Twisted实现并发),python,scrapy,twisted,Python,Scrapy,Twisted,Scrapy的概念是(通过扭曲)从Scrapy返回的项目。下面的代码示例是为(下面复制的代码)提供的。如何通过并发调用处理项目,安全地使用集合?似乎Scrapy调用了项目管道 扭曲和刮擦主要是单螺纹。它们不是抢占式多线程,而是通过协作多任务提供并发性。在协作多任务系统中,不存在抢占。这意味着像上面的process\u item这样的函数完全可以安全地假定self.ids\u seen不会在其第一行和第二行到最后一行之间更改。只有此进程\u项方法正在运行。在处理项目合作放弃控制之前,不得进行任何其

Scrapy的概念是(通过扭曲)从Scrapy返回的项目。下面的代码示例是为(下面复制的代码)提供的。如何通过并发调用
处理项目
,安全地使用
集合
?似乎Scrapy调用了项目管道


扭曲和刮擦主要是单螺纹。它们不是抢占式多线程,而是通过协作多任务提供并发性。在协作多任务系统中,不存在抢占。这意味着像上面的
process\u item
这样的函数完全可以安全地假定
self.ids\u seen
不会在其第一行和第二行到最后一行之间更改。只有此
进程\u项
方法正在运行。在
处理项目
合作放弃控制之前,不得进行任何其他工作。它通过引发异常或返回值来实现这一点。发生这种情况时,控件将返回其调用者(或最接近的
处理程序除外)。然后,该代码开始运行,直到它决定放弃控制,依此类推。最终,控制返回到Twisted
reactor
,它通过调用某个应用程序方法选择另一个事件来服务。然后这个过程重复

from scrapy.exceptions import DropItem

class DuplicatesPipeline:

    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