繁体   English   中英

从线程调用 PyObject_Call 导致堆栈溢出

[英]Calling PyObject_Call from thread causes stack overflow

我正在尝试使用 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 中的错误

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

这是我设置堆栈大小的方法,第三个参数是堆栈大小:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM