Skip to content

Commit 0e4a802

Browse files
committed
the ui revisit
1 parent a3dd3b6 commit 0e4a802

14 files changed

Lines changed: 518 additions & 139 deletions

File tree

123 Bytes
Binary file not shown.
264 Bytes
Binary file not shown.

‎backend/app.py‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
class IndexRequest(BaseModel):
1717
origin: str
1818
k: int
19+
rate_limit_per_sec: float | None = None
1920

2021

2122
class IndexResponse(BaseModel):
@@ -59,7 +60,7 @@ async def index(request: IndexRequest) -> IndexResponse:
5960
created_at=datetime.utcnow(),
6061
status=JobStatus.PENDING,
6162
)
62-
await crawler_service.start_job(job)
63+
await crawler_service.start_job(job, rate_limit_per_sec=request.rate_limit_per_sec)
6364

6465
return IndexResponse(job_id=job_id)
6566

‎backend/crawler.py‎

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,11 +77,17 @@ class CrawlContext:
7777

7878

7979
class CrawlerService:
80-
def __init__(self, queue_maxsize: int = 1000, worker_count: int = 5) -> None:
80+
def __init__(
81+
self,
82+
queue_maxsize: int = 1000,
83+
worker_count: int = 5,
84+
default_rate_limit_per_sec: float = 1.0,
85+
) -> None:
8186
self.queue_maxsize = queue_maxsize
8287
self.worker_count = worker_count
8388
self.jobs: Dict[str, CrawlContext] = {}
8489
self.global_stats = CrawlStats(queue_max=queue_maxsize)
90+
self.default_rate_limit_per_sec = default_rate_limit_per_sec
8591
# Global visited set to avoid crawling the exact same URL across jobs.
8692
self.global_visited: Set[str] = set()
8793
self._lock = asyncio.Lock()
@@ -100,9 +106,10 @@ def get_job(self, job_id: str) -> CrawlJob | None:
100106
def all_jobs(self) -> Dict[str, CrawlJob]:
101107
return {job_id: ctx.job for job_id, ctx in self.jobs.items()}
102108

103-
async def start_job(self, job: CrawlJob) -> None:
109+
async def start_job(self, job: CrawlJob, rate_limit_per_sec: float | None = None) -> None:
104110
queue: "asyncio.Queue[Tuple[str, int, str]]" = asyncio.Queue(maxsize=self.queue_maxsize)
105-
ctx = CrawlContext(job=job, queue=queue)
111+
effective_rate = rate_limit_per_sec or self.default_rate_limit_per_sec
112+
ctx = CrawlContext(job=job, queue=queue, rate_limit_per_sec=effective_rate)
106113
self.jobs[job.id] = ctx
107114

108115
# Persist job metadata so it can be inspected or reloaded after restart.

‎crawler.db‎

1.23 MB
Binary file not shown.

‎frontend/node_modules/.package-lock.json‎

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎frontend/node_modules/fsevents/LICENSE‎

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎frontend/node_modules/fsevents/README.md‎

Lines changed: 89 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎frontend/node_modules/fsevents/fsevents.d.ts‎

Lines changed: 46 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎frontend/node_modules/fsevents/fsevents.js‎

Lines changed: 83 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)