我试图弄清楚如何使用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)。
(我一直在努力寻找一个好的教程,文章等帮助解决这个问题,因此引用任何资源都会非常有帮助。)
答案 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()