Python 3中的递归和多线程冲突

时间:2017-12-08 13:43:09

标签: python-3.x locking python-multithreading

下午好。

我试图将递归函数修改为多线程递归函数以减少处理时间。

我已经在必要的地方实现了RLock对象。

我的递归函数必须打印一个包含98行的嵌套数组,但是使用多线程时有时会发生冲突,我不会检索所有节点。

(使用同步方法)

我试图重现我的代码的行为:

class Foo(object):
    def __init__(self, name):
        self.name = name
        self.nodes = []
        self.lock = threading.RLock()

class Git(object):
    def __init__(self):
        self.lock = threading.RLock()

git = Git()

def getChildrenFiles(node):
    with node.lock:
        with git.lock:
            # sending some commandes to git repository and get some files
            pass
        myRecursiveFunction(child, False)

def myRecursiveFunction(foo, async=True):
    with foo.lock:
        # (Simulation) Retrieving Foo children name from local files
        foo.nodes.append(Foo(....))

        if not foo.nodes:
            return 

        pool = ThreadPool(os.cpu_count())
        if async:
            results = []
            for fooChildren in foo.nodes:
                results.append(pool.apply_async(getChildrenFiles, (fooChildren,)))

            all(res.get() for res in results)
        else:
            for fooChildren in foo.nodes:
                pool.apply(getChildrenFiles, (fooChildren,))

        pool.close()
        pool.join()

if __name__ == "__main__":
    foo = Foo("MyProject")
    myRecursiveFunction(foo)

    '''print foo as Tree Like :

    Foo-A
        Foo-B
            Foo-C
        Foo-E
            Foo-K

     '''

由于

1 个答案:

答案 0 :(得分:0)

我终于找到了问题,它对我的​​程序非常具体,但我仍然会尝试解释它。

解释

在函数 getChildrenFiles 中,我使用git对象的锁,并将git对象声明为全局变量。

问题是我发送的命令如下:

def getChildrenFiles(node):
with node.lock:
    with git.lock:
        sendCommand(....)

    .....

    with git.lock:
        sendOtherCommand(....)

    myRecursiveFunction(child, False)

在第一个命令和第二个命令之间,另一个线程锁定了git对象,第一个线程中git对象使用的一些文件在另一个线程中被更改。然后引发了一个自定义异常。