| 142 | |
| 143 | @_warn_spider_arg |
| 144 | def _get_slot( |
| 145 | self, request: Request, spider: Spider | None = None |
| 146 | ) -> tuple[str, Slot]: |
| 147 | key = self.get_slot_key(request) |
| 148 | if key not in self.slots: |
| 149 | assert self.crawler.spider |
| 150 | slot_settings = self.per_slot_settings.get(key, {}) |
| 151 | conc = self.ip_concurrency or self.domain_concurrency |
| 152 | conc, delay = _get_concurrency_delay( |
| 153 | conc, self.crawler.spider, self.settings |
| 154 | ) |
| 155 | conc, delay = ( |
| 156 | slot_settings.get("concurrency", conc), |
| 157 | slot_settings.get("delay", delay), |
| 158 | ) |
| 159 | randomize_delay = slot_settings.get("randomize_delay", self.randomize_delay) |
| 160 | new_slot = Slot(conc, delay, randomize_delay) |
| 161 | self.slots[key] = new_slot |
| 162 | self._start_slot_gc() |
| 163 | |
| 164 | return key, self.slots[key] |
| 165 | |
| 166 | def get_slot_key(self, request: Request) -> str: |
| 167 | meta_slot: str | None = request.meta.get(self.DOWNLOAD_SLOT) |