perf(session): improve page management and speed up execution
Close pages immediately after tasks finish to reduce resource usage and improve overall performance. Update corresponding test files to reflect the new page lifecycle management.
This commit is contained in:
@@ -44,16 +44,11 @@ class SyncSession:
|
||||
) -> PageInfo: # pragma: no cover
|
||||
"""Get a new page to use"""
|
||||
|
||||
# Close all finished pages to ensure clean state
|
||||
self.page_pool.close_all_finished_pages()
|
||||
|
||||
# If we're at max capacity after cleanup, wait for busy pages to finish
|
||||
if self.page_pool.pages_count >= self.max_pages:
|
||||
start_time = time()
|
||||
while time() - start_time < self._max_wait_for_page:
|
||||
# Wait for any pages to finish, then clean them up
|
||||
sleep(0.05)
|
||||
self.page_pool.close_all_finished_pages()
|
||||
if self.page_pool.pages_count < self.max_pages:
|
||||
break
|
||||
else:
|
||||
@@ -105,16 +100,11 @@ class AsyncSession(SyncSession):
|
||||
) -> PageInfo: # pragma: no cover
|
||||
"""Get a new page to use"""
|
||||
async with self._lock:
|
||||
# Close all finished pages to ensure clean state
|
||||
await self.page_pool.aclose_all_finished_pages()
|
||||
|
||||
# If we're at max capacity after cleanup, wait for busy pages to finish
|
||||
if self.page_pool.pages_count >= self.max_pages:
|
||||
start_time = time()
|
||||
while time() - start_time < self._max_wait_for_page:
|
||||
# Wait for any pages to finish, then clean them up
|
||||
await asyncio_sleep(0.05)
|
||||
await self.page_pool.aclose_all_finished_pages()
|
||||
if self.page_pool.pages_count < self.max_pages:
|
||||
break
|
||||
else:
|
||||
|
||||
@@ -381,8 +381,9 @@ class StealthySession(StealthySessionMixin, SyncSession):
|
||||
page_info.page, first_response, final_response, params.selector_config
|
||||
)
|
||||
|
||||
# Mark the page as finished for next use
|
||||
page_info.mark_finished()
|
||||
# Close the page, to free up resources
|
||||
page_info.page.close()
|
||||
self.page_pool.pages.remove(page_info)
|
||||
|
||||
return response
|
||||
|
||||
@@ -701,8 +702,9 @@ class AsyncStealthySession(StealthySessionMixin, AsyncSession):
|
||||
page_info.page, first_response, final_response, params.selector_config
|
||||
)
|
||||
|
||||
# Mark the page as finished for next use
|
||||
page_info.mark_finished()
|
||||
# Close the page, to free up resources
|
||||
await page_info.page.close()
|
||||
self.page_pool.pages.remove(page_info)
|
||||
|
||||
return response
|
||||
|
||||
|
||||
@@ -305,8 +305,9 @@ class DynamicSession(DynamicSessionMixin, SyncSession):
|
||||
page_info.page, first_response, final_response, params.selector_config
|
||||
)
|
||||
|
||||
# Mark the page as finished for next use
|
||||
page_info.mark_finished()
|
||||
# Close the page, to free up resources
|
||||
page_info.page.close()
|
||||
self.page_pool.pages.remove(page_info)
|
||||
|
||||
return response
|
||||
|
||||
@@ -554,9 +555,9 @@ class AsyncDynamicSession(DynamicSessionMixin, AsyncSession):
|
||||
page_info.page, first_response, final_response, params.selector_config
|
||||
)
|
||||
|
||||
# Mark the page as finished for next use
|
||||
page_info.mark_finished()
|
||||
|
||||
# Close the page, to free up resources
|
||||
await page_info.page.close()
|
||||
self.page_pool.pages.remove(page_info)
|
||||
return response
|
||||
|
||||
except Exception as e: # pragma: no cover
|
||||
|
||||
@@ -23,11 +23,6 @@ class PageInfo:
|
||||
self.state = "busy"
|
||||
self.url = url
|
||||
|
||||
def mark_finished(self):
|
||||
"""Mark the page as finished for new requests"""
|
||||
self.state = "finished"
|
||||
self.url = ""
|
||||
|
||||
def mark_error(self):
|
||||
"""Mark the page as having an error"""
|
||||
self.state = "error"
|
||||
@@ -83,33 +78,3 @@ class PagePool:
|
||||
"""Remove pages in error state"""
|
||||
with self._lock:
|
||||
self.pages = [p for p in self.pages if p.state != "error"]
|
||||
|
||||
def close_all_finished_pages(self):
|
||||
"""Close all pages in finished state and remove them from the pool"""
|
||||
with self._lock:
|
||||
pages_to_remove = []
|
||||
for page_info in self.pages:
|
||||
if page_info.state == "finished":
|
||||
try:
|
||||
page_info.page.close()
|
||||
except Exception:
|
||||
pass
|
||||
pages_to_remove.append(page_info)
|
||||
|
||||
for page_info in pages_to_remove:
|
||||
self.pages.remove(page_info)
|
||||
|
||||
async def aclose_all_finished_pages(self):
|
||||
"""Async version: Close all pages in finished state and remove them from the pool"""
|
||||
with self._lock:
|
||||
pages_to_remove = []
|
||||
for page_info in self.pages:
|
||||
if page_info.state == "finished":
|
||||
try:
|
||||
await page_info.page.close()
|
||||
except Exception:
|
||||
pass
|
||||
pages_to_remove.append(page_info)
|
||||
|
||||
for page_info in pages_to_remove:
|
||||
self.pages.remove(page_info)
|
||||
|
||||
Reference in New Issue
Block a user