Twisted и Scrapy в основном однопоточные. Вместо вытесняющей многопоточности они обеспечивают параллелизм посредством совместной многозадачности. В кооперативной многозадачной системе нет вытеснения. Это означает, что функция, подобная process_item
выше, вполне безопасно предположить, что self.ids_seen
не изменится между первой и предпоследней строками. Только этот метод process_item
работает. Никакая другая работа не может выполняться, пока process_item
совместно не откажется от управления. Он делает это, вызывая исключение или возвращая значение. Когда это происходит, управление возвращается вызывающей стороне (или какому-либо другому обработчику except
). Затем этот код запускается, пока не решит отказаться от управления, и так далее. В конце концов управление полностью возвращается к Twisted reactor
, который выбирает другое событие для обслуживания, вызывая некоторый метод приложения. Затем процесс повторяется.