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

使用Firestore模拟器时调用OpenAI出现挂起问题求助

解决Firebase模拟器中Firestore写入后OpenAI请求无限挂起的问题

问题背景

在Mac OS 14.0环境下,使用Python 3.11.8或3.12.2开发Firebase函数时,先通过Firestore模拟器写入数据,再调用OpenAI API会导致程序无限挂起;若注释掉Firestore写入操作,OpenAI请求可正常完成(约15秒)。该问题与Stack Exchange上的未解决问题完全一致。

可能原因

Firebase Admin SDK的Firestore客户端(基于gRPC)与OpenAI Python SDK的HTTP客户端之间存在资源占用冲突,模拟器环境下未正确释放的连接或事件循环阻塞了后续网络请求。

解决方案

方案1:显式关闭Firestore gRPC通道

在Firestore写入操作完成后,手动关闭客户端的gRPC通道,释放占用的网络资源,避免影响后续OpenAI请求:

import os
from firebase_admin import initialize_app, firestore
import openai
from google.cloud.firestore_v1.client import Client as FirestoreClient

# 配置Firestore模拟器
os.environ["FIRESTORE_EMULATOR_HOST"] = 'localhost:8080'
app = initialize_app()

# 替换为你的项目ID
db = firestore.Client(project="your-project-id")

# OpenAI配置
OPENAI_API_KEY = "sk-..."
OPENAI_MODEL = "gpt-4"
messages = [
    {"role": "system", "content": "You are an intelligent AI assistant."},
    {"role": "user", "content": "Write python code to generate the first 100 prime numbers."}
]

# 执行Firestore写入
db.collection("test").add({"test": "test"})

# 显式关闭Firestore的gRPC通道
if isinstance(db, FirestoreClient):
    db._firestore_api.transport.grpc_channel.close()

# 发起OpenAI请求
openai_client = openai.OpenAI(api_key=OPENAI_API_KEY)
response = openai_client.chat.completions.create(
    model=OPENAI_MODEL,
    messages=messages,
)

print(response.choices[0].message.content)

方案2:用线程隔离Firestore与OpenAI操作

将OpenAI请求放在独立线程中执行,避免主线程中Firestore的资源占用阻塞后续请求:

import os
import threading
from firebase_admin import initialize_app, firestore
import openai

# 配置Firestore模拟器
os.environ["FIRESTORE_EMULATOR_HOST"] = 'localhost:8080'
app = initialize_app()

# 替换为你的项目ID
db = firestore.Client(project="your-project-id")

# OpenAI配置
OPENAI_API_KEY = "sk-..."
OPENAI_MODEL = "gpt-4"
messages = [
    {"role": "system", "content": "You are an intelligent AI assistant."},
    {"role": "user", "content": "Write python code to generate the first 100 prime numbers."}
]

# 执行Firestore写入
db.collection("test").add({"test": "test"})

# 独立线程中执行OpenAI请求
def execute_openai_request():
    openai_client = openai.OpenAI(api_key=OPENAI_API_KEY)
    response = openai_client.chat.completions.create(
        model=OPENAI_MODEL,
        messages=messages,
    )
    print(response.choices[0].message.content)

# 启动并等待线程完成
thread = threading.Thread(target=execute_openai_request)
thread.start()
thread.join()

方案3:调整Firebase初始化时机

将OpenAI客户端的初始化提前到Firestore操作之前,避免资源冲突:

import os
from firebase_admin import initialize_app, firestore
import openai

# 提前初始化OpenAI客户端
OPENAI_API_KEY = "sk-..."
OPENAI_MODEL = "gpt-4"
openai_client = openai.OpenAI(api_key=OPENAI_API_KEY)

messages = [
    {"role": "system", "content": "You are an intelligent AI assistant."},
    {"role": "user", "content": "Write python code to generate the first 100 prime numbers."}
]

# 配置Firestore模拟器
os.environ["FIRESTORE_EMULATOR_HOST"] = 'localhost:8080'
app = initialize_app()

# 替换为你的项目ID
db = firestore.Client(project="your-project-id")

# 执行Firestore写入
db.collection("test").add({"test": "test"})

# 发起OpenAI请求
response = openai_client.chat.completions.create(
    model=OPENAI_MODEL,
    messages=messages,
)

print(response.choices[0].message.content)

验证步骤

  1. 启动Firestore模拟器:firebase emulators:start --only firestore
  2. 替换代码中的项目ID和OpenAI API密钥
  3. 运行修改后的代码,确认程序不再挂起并正常输出OpenAI返回的内容

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 16:57:19