Prioritize other requests over start requests

This commit is contained in:
Adrián Chaves 2025-05-27 08:32:24 +02:00
parent 82a3245158
commit 9d92d16510
3 changed files with 29 additions and 25 deletions

View File

@ -173,8 +173,8 @@ class Scheduler(BaseScheduler):
:ref:`Start requests <start-requests>` are sent in the order they are
yielded from :meth:`~scrapy.Spider.start`, and given the same
:attr:`~scrapy.http.Request.priority`, start requests take precedence over
other requests.
:attr:`~scrapy.http.Request.priority`, other requests take precedence over
start requests.
You can set :setting:`SCHEDULER_START_MEMORY_QUEUE` and
:setting:`SCHEDULER_START_DISK_QUEUE` to ``None`` to handle start requests

View File

@ -160,28 +160,32 @@ class ScrapyPriorityQueue:
def pop(self) -> Request | None:
while self.curprio is not None:
if self._start_queues:
try:
q = self._start_queues[self.curprio]
except KeyError:
pass
else:
m = q.pop()
if not q:
del self._start_queues[self.curprio]
q.close()
return m
try:
q = self.queues[self.curprio]
except KeyError:
self._update_curprio()
pass
else:
m = q.pop()
if not q:
del self.queues[self.curprio]
q.close()
self._update_curprio()
if not self._start_queues:
self._update_curprio()
return m
if self._start_queues:
try:
q = self._start_queues[self.curprio]
except KeyError:
self._update_curprio()
else:
m = q.pop()
if not q:
del self._start_queues[self.curprio]
q.close()
self._update_curprio()
return m
else:
self._update_curprio()
return None
def _update_curprio(self) -> None:

View File

@ -189,9 +189,9 @@ class RequestSendOrderTestCase(TestCase):
@deferred_f_from_coro_f
async def test_default(self):
"""By default, start requests take priority over callback requests and
"""By default, callback requests take priority over start requests and
are sent in order. Priority matters, but given the same priority, a
start request takes precedence."""
callback request takes precedence."""
nums = [1, 2, 3, 4, 5, 6]
response_seconds = 0
download_slots = 1
@ -207,13 +207,13 @@ class RequestSendOrderTestCase(TestCase):
yield _request(1)
for request in (
_request(4, priority=1),
_request(6),
_request(2, priority=1),
_request(5),
):
spider.crawler.engine._slot.scheduler.enqueue_request(request)
yield _request(5)
yield _request(2, priority=1)
yield _request(6)
yield _request(3, priority=1)
yield _request(4, priority=1)
def parse(spider, response):
return
@ -249,13 +249,13 @@ class RequestSendOrderTestCase(TestCase):
yield _request(1)
for request in (
_request(4, priority=1),
_request(6),
_request(2, priority=1),
_request(5),
):
spider.crawler.engine._slot.scheduler.enqueue_request(request)
yield _request(5)
yield _request(6)
yield _request(4, priority=1)
yield _request(3, priority=1)
yield _request(2, priority=1)
def parse(spider, response):
return