在线程中调用递归函数是个好主意吗? 我正在创建10个线程,线程函数依次调用递归函数。坏的部分是
ThreadFunc( )
{
for( ;condn ; )
recursiveFunc(objectId);
}
bool recursiveFunc(objectId)
{
//Get a instance to the database connection
// Query for attibutes of this objectId
if ( attibutes satisfy some condition)
return true;
else
recursiveFunc(objectId) // thats the next level of objectId
}
递归函数对数据库有一些调用 我的猜测是在循环内调用递归函数会导致性能下降。任何人都可以确认
答案 0 :(得分:2)
在线程内递归调用函数本身并不是一个坏主意。您唯一需要注意的是限制递归深度,或者您可能产生(等待它......)堆栈溢出。这不是特定于多线程,但适用于使用递归的任何情况。
在这种情况下,我建议不要使用递归,因为它没有必要。您的代码是tail recursion的示例,它总是可以用循环替换。这消除了堆栈溢出问题:
bool recursiveFunc(objectId)
{
do
{
// Get an instance to the database connection
// Query for attributes of this objectId
// Update objectId if necessary (not sure what the "next level of objectId" is)
}
while(! attributes satisfy some condition);
return true;
}
答案 1 :(得分:1)
没有技术上的理由说明为什么这不起作用 - 这是完全合法的。
为什么这段代码是“不好的部分”?
您需要对此进行调试/配置以及recursiveFunc
以查看性能下降的位置。
根据您发布的代码,您检查了condn
是否满意,以便您的循环终止。如果没有,它将永远循环。
recursiveFunc
实际上做了什么?
<强>更新强>
根据您的评论,每个线程执行15,000次迭代,我要做的第一件事就是将Get an instance to the database connection
代码移到 recursiveFunc
之外,这样您才能获得每个帖子一次。
即使你重写成一个循环(根据Martin B的答案),你仍然希望这样做。
答案 2 :(得分:0)
这取决于递归函数如何与数据库进行通信。如果每个(或许多)递归级别重新打开数据库,这可能是降级的原因。如果它们共享与数据库相同的“连接”,则问题不在于递归,而在于并发访问数据库的线程数。
答案 3 :(得分:0)
我看到发布代码的唯一潜在问题是它可以表示无限循环,而这通常不是您想要的(因此您必须在已知可到达条件的某处强制中断以避免不得不异常终止应用程序为了打破线程(以及随后的线程)。
出于各种原因,线程,递归和数据库访问都会导致性能下降。 从你向我们展示的那个小小的东西中,无论是否存在任何或所有问题都是错误的。