You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 22:10:59