使用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)
验证步骤
- 启动Firestore模拟器:
firebase emulators:start --only firestore - 替换代码中的项目ID和OpenAI API密钥
- 运行修改后的代码,确认程序不再挂起并正常输出OpenAI返回的内容
内容的提问来源于stack exchange,提问作者Matthew Clegg
相关产品推荐
相关产品推荐

