为什么Firebase Cloud Functions的Python请求会导致CoreFoundation错误?

wnvonmuf  于 2023-06-07  发布在  Python
关注(0)|答案(2)|浏览(162)

我试图通过Firebase云函数(第二代云函数python公共预览)中的python脚本向第三方API发出请求:

def foo(req: https_fn.Request) -> https_fn.Response:
    url = 'https://catfact.ninja/fact'
    res = requests.get(url)
    return json.dumps(res.json())

当我调用这个函数时,我得到以下错误:
进程已分叉,您无法安全地使用此CoreFoundation功能。你必须exec()。在THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC()时中断以进行调试。
我知道这与请求有关,因为当我删除请求时,此错误不再发生。我在网上读到这个问题是一个与Mac相关的事情,我确实在Mac上。我还尝试在一个单独的python文件中简单地执行上面的请求,效果很好。这让我相信这个问题与Firebase Functions中的某些内容有关。有人知道这里发生了什么吗?

j5fpnvbx

j5fpnvbx1#

此错误是由于在MacOS中使用fork模式进行多处理而导致的。
进程已分叉,您无法安全地使用此CoreFoundation功能。你必须exec()。中断THE_PROCESS_HAS_FORKED_AND_YOU_CANNOT_USE_THIS_COREFOUNDATION_FUNCTIONALITY___YOU_MUST_EXEC()以进行调试。
在使用Python的原生http.client时解决该问题的原因很可能是因为该库不依赖于CoreFoundation。在这种情况下可以得出结论,当使用库时,它在发出HTTP请求时隐式地使用它,而不是使用CoreFoundation功能。
解决这类问题的另一种方法是显式地将多处理启动方法设置为spawn。Since using fork mode on MacOS is unsafe.

multiprocessing.set_start_method('spawn')
vbkedwbf

vbkedwbf2#

对于将来可能再次遇到此问题的任何人,请更新-我发现,当部署时,请求库将没有任何问题。然而,在Firebase模拟器的MacOS上,它似乎会导致一些分叉问题(不知道这到底意味着什么)。使用Python的原生http.client库似乎可以解决这个问题。希望这能救一些未来的人我经历的2到3天的痛苦:)

  • 编辑其他更新:

经过更多的挠头和谷歌搜索以及与GPT的咨询,我了解到在函数的根代码中导入numpy会导致我不理解或不想进一步理解的问题。重要的是,你要在你的函数定义中导入numpy这样的库,而不是在代码的根目录中:
这样做:

from firebase_functions import https_fn
from firebase_admin import initialize_app

import requests
import json

initialize_app()

@https_fn.on_request()
def on_request_example(req: https_fn.Request) -> https_fn.Response:
    import numpy as np
    
    arrayFlt = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
    stuff = np.array(arrayFlt)
    new_stuff = make_new_stuff(stuff)
    
    url = 'https://catfact.ninja/fact'
    res = requests.get(url)
    return json.dumps(res.json())

而不是这个:

from firebase_functions import https_fn
from firebase_admin import initialize_app

import requests
import json
import numpy as np

initialize_app()

@https_fn.on_request()
def on_request_example(req: https_fn.Request) -> https_fn.Response:
    
    arrayFlt = [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
    stuff = np.array(arrayFlt)
    new_stuff = make_new_stuff(stuff)
    
    url = 'https://catfact.ninja/fact'
    res = requests.get(url)
    return json.dumps(res.json())

希望这对某人有帮助!

相关问题