利用共享资源,使用多线程/多处理加速循环累积

2024-09-29 22:00:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在开发一种算法来解决一个Boggle board,WebBoggle。我已经成功地使用了python3,但我现在正试图优化它,使其尽可能快地工作,我想使用多线程或多处理来实现加速

我认为这可以很好地体现在算法开头的for循环中,该循环反复调用重载函数,如下所示:

nodes = [{obj1}, {obj2}, {obj3}, ... , {obj16}]
word_tree = {"children": {"A": {"data": "A", "children" :{...}}, "B": {"data": "B", "children": {...}}, ...}}

def doSomeWork():
    found_words = []
    for i in range(15):
        found_values += doHeavyLifting(nodes[i], word_tree.children["A"])
    return found_words

在这种情况下nodes数组在算法期间是静态的,可以将其视为只读的,每个进程或线程都可以安全地读取它,而不必担心竞争条件或锁定

但是word_tree对象(希望上面清楚地描述了它)是由doHeavyLifting函数修改的,但是是分段的,即word_tree中有许多nodes,如果需要锁,它将在单个node上获得,而不是在整个word_tree上,例如该函数可能会改变节点a的某些内容,但它不需要对节点a的子节点(对这些子节点的引用存储在节点a的childrendict中)进行锁定

最终doHeavyLifting的返回值存储在found_words数组中,并在处理完所有nodes后返回。(doHeavyLifting是一个递归函数,但我不确定这对这个问题有什么影响…)

我从来没有在Python中使用过多线程,也从来没有使用过多处理,我想知道如何实现这个循环,使用16个CPU线程,可以同时处理nodes数组中的每个元素(或者在系统资源允许的情况下进行类似处理),以及doSomeWork函数将返回的单个返回值存储在一个变量中

谢谢


Tags: 函数算法treefordata节点情况数组

热门问题