คำถามเกี่ยวกับความปลอดภัยของเธรดสำหรับคอลเลกชัน Python ใน Scrapy Item Pipelines (ใช้ Twisted สำหรับการใช้งานพร้อมกัน)

Scrapy มีแนวคิดของ Item Pipelines ที่ ประมวลผลพร้อมกัน (ผ่าน Twisted) รายการที่ส่งคืนจาก Scrapy แมงมุม ตัวอย่างโค้ดต่อไปนี้มีไว้สำหรับ การกรองรายการที่ซ้ำกัน (คัดลอกโค้ดด้านล่าง) เป็นไปได้อย่างไรที่ set สามารถใช้งานได้อย่างปลอดภัยโดยการโทรไปที่ process_item พร้อมกัน ดูเหมือนว่า Scrapy จะเรียกใช้รายการไปป์ไลน์ ที่นี่ .

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

person Jessica    schedule 29.05.2020    source แหล่งที่มา


คำตอบ (1)


Twisted และ Scrapy ส่วนใหญ่เป็นแบบเธรดเดียว แทนที่จะใช้มัลติเธรดแบบยึดเอาเสียก่อน พวกเขาให้การทำงานพร้อมกันโดยอาศัยการทำงานร่วมกันแบบมัลติทาสกิ้ง ในระบบมัลติทาสกิ้งแบบร่วมมือ ไม่มีการยกเว้นใดๆ ซึ่งหมายความว่าฟังก์ชันเช่น process_item ด้านบนนั้นปลอดภัยอย่างยิ่งที่จะถือว่า self.ids_seen จะไม่เปลี่ยนระหว่างบรรทัดแรกและบรรทัดที่สองถึงบรรทัดสุดท้าย เฉพาะเมธอด process_item นี้เท่านั้นที่ทำงานอยู่ ไม่มีงานอื่นเกิดขึ้นได้จนกว่า process_item จะร่วมมือกันยอมแพ้ ทำได้โดยการเพิ่มข้อยกเว้นหรือส่งกลับค่า เมื่อสิ่งนี้เกิดขึ้น การควบคุมจะกลับไปยังผู้เรียก (หรือตัวจัดการ except ที่ใกล้ที่สุดคืออะไรก็ตาม) จากนั้นโค้ดนั้นจะเริ่มทำงานจนกว่าจะตัดสินใจยกเลิกการควบคุม และอื่นๆ ในที่สุดการควบคุมจะถูกส่งกลับไปยัง Twisted reactor ซึ่งเลือกเหตุการณ์อื่นที่จะให้บริการโดยการเรียกวิธีแอปพลิเคชันบางอย่าง จากนั้นกระบวนการจะทำซ้ำ

person Jean-Paul Calderone    schedule 29.05.2020