@@ -200,7 +200,21 @@ async def parse_rss(
200200 logger .info (f"Redis缓存命中: { rss_url } " )
201201 return APIResponse .ok (data = json .loads (cached_data ))
202202 try :
203- feed : feedparser .FeedParserDict = feedparser .parse (rss_url )
203+ # 异步获取feed内容,带超时控制
204+ async with httpx .AsyncClient (
205+ timeout = httpx .Timeout (10.0 , connect = 5.0 ), follow_redirects = True
206+ ) as client :
207+ resp = await client .get (rss_url )
208+ resp .raise_for_status ()
209+ content = resp .content
210+
211+ # 在线程池中解析内容
212+ import asyncio
213+
214+ loop = asyncio .get_running_loop ()
215+ feed : feedparser .FeedParserDict = await loop .run_in_executor (
216+ None , feedparser .parse , content
217+ )
204218 if feed .bozo != 0 :
205219 return APIResponse .error (message = "无法解析RSS链接" , code = 400 )
206220 feed_meta = _build_feed_meta (feed )
@@ -437,7 +451,21 @@ async def refresh_subscription(
437451 await redis .delete (redis_key )
438452
439453 try :
440- feed : feedparser .FeedParserDict = feedparser .parse (rss_url )
454+ # 异步获取feed内容,带超时控制
455+ async with httpx .AsyncClient (
456+ timeout = httpx .Timeout (10.0 , connect = 5.0 ), follow_redirects = True
457+ ) as client :
458+ resp = await client .get (rss_url )
459+ resp .raise_for_status ()
460+ content = resp .content
461+
462+ # 在线程池中解析内容
463+ import asyncio
464+
465+ loop = asyncio .get_running_loop ()
466+ feed : feedparser .FeedParserDict = await loop .run_in_executor (
467+ None , feedparser .parse , content
468+ )
441469 if feed .bozo != 0 :
442470 return APIResponse .error (message = "无法解析RSS链接" , code = 400 )
443471 feed_meta = _build_feed_meta (feed )
0 commit comments