我想生成X个池工作者并给他们每个人做X%的工作。我的问题是工作需要大约20分钟才能耗尽,每运行一次额外的过程会花费更长的时间,因为计算的类型可以在几分钟或几小时内找到我的答案。我想要做的是为一个单独的工作人员实现某种方式“我发现它”并使用该信号杀死池的其余部分并继续我的计算。
关键点:
starmap_async
上运行。 我还考虑过使用Queue,但是因为我传递给每个人的工作范围已经内置到函数的参数中,所以不会这样做。
下面是我正在使用的一个非常迟钝的版本(我正在使用的计算可能需要数小时才能完成超过42亿复杂的迭代。)
def doWork():
workers = Pool(2)
results = workers.starmap_async( func = distSearch , iterable = Sections1_5, callback = killPool )
workers.close()
print("Found answer : {}".format(results.get()))
workers.join()
def killPool():
workers.terminate()
print("Worker Pool Terminated")
我应该指定我的进程只有在找到答案时才返回,否则它只在完成后退出。我已经查看了this线程,但它完全丢失了,并且在工作池的返回/回调中应该检查win条件时似乎需要很多开销。
我发现的所有答案都会通过监督工作池来产生巨大的开销,我正在寻找一种解决方案,可以自动地在工作级别获取kill信号。
答案 0 :(得分:1)
我正在寻找一种解决方案,可以自主地在工人级别获取杀伤信号。
AFAIK,并不存在。 Pool
对象的方法(如Pool.terminate
)应仅在创建池的过程中使用。
您可以使用Pool.imap_unordered
。这会在结果中返回父进程中的迭代器,一旦结果可用就会生成结果。一旦弹出所需的结果,您就可以使用Pool.terminate()
。
修改强>:
starmap_async
开始,返回MapResult
实例,不是迭代器。imap_unordered
。