Django Rest Framework中使用Google Generative AI遇Event loop is closed错误
解决Django Rest Framework异步视图中调用Google Generative AI后续请求报错问题
错误原因
首次请求正常,后续请求触发RuntimeError: Event loop is closed及协程未await警告,核心原因是每次请求创建GenerativeModel实例时,其内部异步客户端会绑定当前请求的事件循环;请求结束后Django关闭该循环,后续请求复用实例时会尝试调用已关闭的循环。
方案1:复用GenerativeModel实例
将模型实例移至模块级别,避免每次请求创建新实例,确保客户端复用当前活跃的事件循环:
import google.generativeai as genai from rest_framework.response import Response from adrf.views import async_api_view from django.conf import settings # 模块级别初始化配置与模型实例 genai.configure(api_key=settings.GOOGLE_API_KEY) model = genai.GenerativeModel(settings.MODEL) @async_api_view(['POST']) async def post_message(request): """发送消息到Gemini的异步视图""" messages = [ {'role':'user', 'parts': ["Briefly explain how a computer works to a young child."]} ] response = await model.generate_content_async(messages) print(response) return Response({'msg': response.text})
方案2:改用同步方法+异步包装
如果复用实例仍存在兼容问题,可将Gemini的同步生成方法包装为异步调用,彻底避免事件循环绑定冲突:
import google.generativeai as genai from rest_framework.response import Response from adrf.views import async_api_view from django.conf import settings from asgiref.sync import sync_to_async genai.configure(api_key=settings.GOOGLE_API_KEY) @async_api_view(['POST']) async def post_message(request): """发送消息到Gemini的异步视图""" model = genai.GenerativeModel(settings.MODEL) messages = [ {'role':'user', 'parts': ["Briefly explain how a computer works to a young child."]} ] # 将同步方法包装为异步执行 response = await sync_to_async(model.generate_content)(messages) print(response) return Response({'msg': response.text})
内容的提问来源于stack exchange,提问作者Br0k3nS0u1
相关产品推荐
相关产品推荐

