下午好。
我试图将递归函数修改为多线程递归函数以减少处理时间。
我已经在必要的地方实现了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
'''
由于
答案 0 :(得分:0)
我终于找到了问题,它对我的程序非常具体,但我仍然会尝试解释它。
在函数 getChildrenFiles 中,我使用git对象的锁,并将git对象声明为全局变量。
问题是我发送的命令如下:
def getChildrenFiles(node):
with node.lock:
with git.lock:
sendCommand(....)
.....
with git.lock:
sendOtherCommand(....)
myRecursiveFunction(child, False)
在第一个命令和第二个命令之间,另一个线程锁定了git对象,第一个线程中git对象使用的一些文件在另一个线程中被更改。然后引发了一个自定义异常。