使用多处理来加速搜索

时间:2014-12-19 00:05:34

标签: python

我试图弄清楚如何使用python的多处理(或其他一些python库)来加速搜索。我目前正在使用Python 3.4.2。这是我如何设置我的搜索和查找(我的实际代码是其他方式,但示例代码是准确的立场):

import random
def search():
    nums = list(range(1000))  # use a smaller range to test code
    random.shuffle(nums)
    if {1, 3, 13} - set(nums[:20]) == set(): # some random hard-coded search
        return nums
    return None

def find():
    res = None
    while res is None:
        res = search()
    return res

>>>find()
[56, 46, 71, 65, 47, 13, 96, 1, 3, 7, 16, 17, 28, ...

毋庸置疑,我本可以将搜索编写为单一功能。我可以并行化这个搜索吗?也就是说,我可以在多个处理器上启动search并在其中一个处理器返回非None结果后停止搜索吗?我该怎么做呢? (另外,我无法访问OpenMP,使用Yosetime和all,而不想安装gcc)。

(我一直在努力寻找一个好的教程,文章等帮助解决这个问题,因此引用任何资源都会非常有帮助。)

1 个答案:

答案 0 :(得分:2)

不是每次都产生一个新进程(可能会变得昂贵),为什么不将函数体包装在while True中,然后在任何进程给出有用结果时终止该函数:

import random
import multiprocessing as mp

def search(qOut):
    while True:
        nums = list(range(1000))  # use a smaller range to test code
        random.shuffle(nums)
        if {1, 3, 13} - set(nums[:20]) == set(): # some random hard-coded search
            qOut.put(nums)

def find():
    q = mp.Queue()
    numProcs = mp.cpu_count() -1  # one per processor
    procs = [mp.Process(target=search, args=(q,) for _ in range(numProcs)]
    for p in procs:
        p.start()

    res = q.get()
    print("Got a result")

    for p in procs:
        p.terminate()