| 60 | ) |
| 61 | |
| 62 | def _response_downloaded( |
| 63 | self, response: Response, request: Request, spider: Spider |
| 64 | ) -> None: |
| 65 | key, slot = self._get_slot(request, spider) |
| 66 | latency = request.meta.get("download_latency") |
| 67 | if ( |
| 68 | latency is None |
| 69 | or slot is None |
| 70 | or request.meta.get("autothrottle_dont_adjust_delay", False) is True |
| 71 | ): |
| 72 | return |
| 73 | |
| 74 | olddelay = slot.delay |
| 75 | self._adjust_delay(slot, latency, response) |
| 76 | if self.debug: |
| 77 | diff = slot.delay - olddelay |
| 78 | size = len(response.body) |
| 79 | conc = len(slot.transferring) |
| 80 | logger.info( |
| 81 | "slot: %(slot)s | conc:%(concurrency)2d | " |
| 82 | "delay:%(delay)5d ms (%(delaydiff)+d) | " |
| 83 | "latency:%(latency)5d ms | size:%(size)6d bytes", |
| 84 | { |
| 85 | "slot": key, |
| 86 | "concurrency": conc, |
| 87 | "delay": slot.delay * 1000, |
| 88 | "delaydiff": diff * 1000, |
| 89 | "latency": latency * 1000, |
| 90 | "size": size, |
| 91 | }, |
| 92 | extra={"spider": spider}, |
| 93 | ) |
| 94 | |
| 95 | def _get_slot( |
| 96 | self, request: Request, spider: Spider |