python多线程"最大递归深度超过"

chn*_*net 4 python recursion multithreading depth

我使用Python多线程来实现Quicksort.Quicksort是在函数中实现的.它是一个递归函数.每个线程调用Quicksort对它拥有的数组进行排序.每个线程都有自己的数组,用于存储需要排序的数字.如果数组大小较小(<10,000).它运行正常.但是,如果数组大小较大,则显示"最大递归深度超过".所以,我使用setrecursionlimit()函数将递归深度重置为1500.但程序直接崩溃...以下是quicksort代码.如果不在多线程环境中,它可以很好地工作.似乎多线程是递归深度问题的原因.

def partition (array, p, r):
    x = array[r]
    i = (p-1)
    j = p
    while (1):
        if array[j] <= x:
            i = (i+1)
            temp = array[j]
            array[j] = array[i]
            array[i] = temp
        j+=1
        if j == r:
            break
    temp = array[i+1]
    array[i+1] = array[r]
    array[r] = temp
    return i+1

def quicksort (array, p, r):
    if p < r:
        q = partition (array, p, r)
        quicksort (array, p, q-1)
        quicksort (array, q+1, r)
Run Code Online (Sandbox Code Playgroud)

Dan*_*ach 6

听起来你真正的问题是"为什么使用线程时递归深度更短"?我会尽力回答这个问题.

首先,背景.每个级别的递归都存储在称为堆栈的内存区域中.不幸的是,系统必须提前分配堆栈空间,并且事先并不知道程序可能需要多少堆栈空间.这就是太多递归导致"最大递归深度"错误的原因:您的程序耗尽了所有的堆栈空间.

每个线程都需要自己的堆栈来存储当前在该线程中执行的函数列表.在单线程程序中,系统可以为该一个线程提供大量内存给堆栈.在多线程程序中,系统必须更加保守,并且每个线程只提供一个小堆栈.否则,具有许多线程的程序可能会快速耗尽所有系统内存,只有堆栈空间(大多数不会被使用).

所有这些都是由操作系统和/或C库完成的,而Python(更确切地说,CPython)运行在C库之上.Python努力阻止您使用整个C堆栈,因为这会导致硬崩溃而不仅仅是异常.您可以告诉Python如何使用该setrecursionlimit函数,但这不会改变可用的实际堆栈空间量.

在具有bash shell的unix-ish系统上,您可以使用该ulimit -s命令更改堆栈大小.help ulimit在bash shell提示符下键入以获取更多信息.