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

Django中OpenAI异步API新闻处理任务同步错误修复咨询

问题修复方案

核心原因

你碰到的SynchronousOnlyOperation错误,本质是在异步函数里直接调用了Django的同步ORM操作(比如创建、查询、更新模型实例)。Django的ORM默认是同步实现,不允许在异步上下文里直接执行,防止阻塞事件循环。

具体修复步骤

1. 用Django官方工具包装同步ORM操作

把异步函数里所有的ORM调用,用asgiref.sync.sync_to_async包裹,这是Django官方推荐的异步环境执行同步代码的方式。

示例改造:

from asgiref.sync import sync_to_async

async def process_single_news(item):
    # 原同步ORM调用:news = News.objects.create(title=item.title, content=item.content)
    # 改为异步包装形式
    news = await sync_to_async(News.objects.create)(title=item.title, content=item.content)
    
    # 查询、更新等操作同理
    target_category = await sync_to_async(Category.objects.get)(name=item.category)
    await sync_to_async(news.categories.add)(target_category)

2. 确保定时任务适配异步环境

如果你的定时任务用了Celery、Django Q这类工具,要确认任务本身支持异步执行;如果用的是Django自带的django-background-tasks,建议切换到支持异步的任务队列(比如APScheduler的异步调度器):

from apscheduler.schedulers.asyncio import AsyncIOScheduler

# 初始化异步调度器
scheduler = AsyncIOScheduler()
# 绑定异步处理任务,设置每分钟执行
scheduler.add_job(async_process_news_batch, 'interval', minutes=1)
scheduler.start()

3. 规范AsyncOpenAI的调用方式

使用AsyncOpenAI时,所有API调用必须加await,且不能在同步函数里调用异步的OpenAI方法,示例:

from openai import AsyncOpenAI

async def score_news(content):
    client = AsyncOpenAI(api_key="你的API密钥")
    response = await client.chat.completions.create(
        model="gpt-3.5-turbo",
        messages=[{"role": "user", "content": f"给这条新闻评分:{content}"}]
    )
    return response.choices[0].message.content

4. 排查异步调用链的同步隐患

检查所有异步函数的调用链路,确保没有在异步函数里直接触发同步的Django操作(包括模型自定义方法、信号触发的同步逻辑等)。如果模型里有自定义同步方法,同样需要用sync_to_async包装后调用。

额外优化建议

  • 批量处理新闻时,用asyncio.gather实现并行处理,提升效率:
import asyncio

async def process_news_batch(news_items):
    # 为每条新闻创建异步任务
    task_list = [process_single_news(item) for item in news_items]
    # 并行执行所有任务
    await asyncio.gather(*task_list)
  • 给sync_to_async保留默认的thread_sensitive=True,确保ORM操作在同一个线程中执行,避免数据库连接异常。

内容的提问来源于stack exchange,提问作者user26997165

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 09:27:32