【问题标题】:Calling PyObject_Call from thread causes stack overflow从线程调用 PyObject_Call 会导致堆栈溢出
【发布时间】:2020-12-15 07:51:46
【问题描述】:

我正在尝试使用 Jedi https://github.com/davidhalter/jedi 创建一个自定义 python 编辑器,并且我使用的是 c++,它运行良好,但它有点慢并且会停顿一小会儿,所以我从内部调用这些函数c++ 中的线程,但这样做有时会出现堆栈溢出错误。

这是我的代码:

//~ Create Script Instance class
PyObject* pScript = PyObject_Call(
                            PyObject_GetAttrString(GetJediModule(), "Script"),
                            PyTuple_Pack(1, PyString_FromString(TCHAR_TO_UTF8(*Source))), 
                            NULL);

if (pScript == NULL)
{
    UE_LOG(LogTemp, Verbose, TEXT("unable to get Script Class from Jedi Module"));
    Py_DECREF(pScript);
    ClearPython();
    return;
}

//~ Call complete method from Script Class
PyObject* Result = PyObject_Call(
                            PyObject_GetAttrString(pScript, "complete"), 
                            PyTuple_Pack(2, Py_BuildValue("i", Line), Py_BuildValue("i", Offset)), 
                            NULL);

if (Result == NULL)
{
    UE_LOG(LogTemp, Verbose, TEXT("unable to call complete method from Script class"));
    Py_DECREF(Result);
    ClearPython();
    return;
}

调用PyObject_Call时发生错误,我认为是因为线程,因为当我从主线程调用函数时它工作得很好,但是堆栈没有告诉我任何有用的信息,只是python.dll中的一个错误

【问题讨论】:

    标签: python c++ unreal-engine4 jedi-vim


    【解决方案1】:

    好吧,我只是靠运气找到了答案,当我在 UE 中启动我的线程时可以选择堆栈大小,我使用的是 1024 的超小值,我做了一个小修改,我一直在测试 3几个小时没有崩溃了,所以我想现在可以安全地假设它正在工作。

    这是我如何设置堆栈大小,第三个参数是堆栈大小:

    Thread = FRunnableThread::Create(this, TEXT("FAutoCompleteWorker"), 8 * 8 * 4096, TPri_Normal);
    

    【讨论】:

    • 感谢您找到这个! Jedi 确实需要一个具有一定大小的堆栈,因为它经常使用递归。
    猜你喜欢
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2016-02-09
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2014-02-14
    相关资源
    最近更新 更多