如何在page.on回调执行期间暂停主线程,等待回调完成?
实现监听事件并暂停主线程直到回调完成
原代码的问题在于page.on注册的异步回调会和主线程并发执行,主线程不会等待回调逻辑完成就继续往下走。要实现主线程暂停直到回调处理完毕,有两种可行方案:
方案一:直接使用page.wait_for_request(推荐,适合单次等待场景)
如果你的需求是等待特定请求出现并处理,wait_for_request本身就是阻塞式的API,能让主线程暂停直到目标请求触发,之后再执行处理逻辑,天然满足你的需求:
async def mission(self): logger.info('Main operation before waiting') # 等待目标请求出现,主线程会暂停在这里 request = await self.page.wait_for_request(lambda req: "https://some_request.com" in req.url) # 执行处理逻辑,主线程继续暂停直到resolve完成 await Solution(page=self.page).resolve() logger.info('Main operation after processing')
方案二:用asyncio.Event同步主线程与回调(适合持续监听场景)
如果需要持续监听request事件,且某次触发后要暂停主线程,可通过asyncio.Event实现同步:
import asyncio async def mission(self): # 创建事件对象用于同步 callback_done = asyncio.Event() async def handler(request): try: if "https://some_request.com" in request.url: await Solution(page=self.page).resolve() # 处理完成后标记事件,唤醒主线程 callback_done.set() # 若只需处理一次,可移除监听避免重复触发 self.page.remove_listener('request', handler) except Exception as e: # 异常时也要标记事件,防止主线程无限等待 callback_done.set() raise e logger.info('Main operation before registering listener') self.page.on('request', handler) logger.info('Waiting for callback to finish...') # 主线程暂停,直到事件被标记完成 await callback_done.wait() logger.info('Main operation after callback completed')
注意事项
- 方案一中
wait_for_request会自动等待第一个匹配的请求,若需要等待多个请求,可循环调用或结合方案二。 - 方案二中务必处理异常,否则如果回调抛出错误,事件未被设置,主线程会一直阻塞。
内容的提问来源于stack exchange,提问作者Ziqi Xiao
相关产品推荐
相关产品推荐

