【发布时间】:2015-12-28 00:40:15
【问题描述】:
我想生成 X 数量的 Pool 工作人员,并给他们每个人 X% 的工作要做。我的问题是,这项工作大约需要 20 分钟才能耗尽,每个额外的进程运行时间更长,由于正在完成的计算类型,我的答案可能会在几分钟或几小时内找到。我想做的是为单个工作人员实现某种方式来“嘿,我找到了”并使用该信号来杀死池的其余部分并继续我的计算。
关键点:
- 我尝试过回调,它们似乎在整个池完成之前不会在
starmap_async上运行。 - 我只关心找到的第一个合适的答案。
- 我不共享资源,并且意外进程死亡,尽管很粗鲁,但完全可以接受。
我也考虑过使用队列,但它不会,因为我传递给每个队列的工作范围已经内置到函数的参数中。
下面是我正在使用的一个非常枯燥的版本(我正在使用的计算可能需要数小时才能完成超过 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 线程,但我完全迷路了,而且在工作池的返回/回调中持续检查获胜条件似乎需要很多开销。
我发现的所有答案都会通过监督工作池而导致大量开销,我正在寻找一种解决方案,可以在工作人员级别自动获取终止信号。
【问题讨论】:
标签: python multithreading exit flags pool