gpt4 book ai didi

python - 如果其中一个线程先结束,则结束python多线程

转载 作者:行者123 更新时间:2023-12-01 01:45:40 24 4
gpt4 key购买 nike

所以,我有以下代码,我用它来同时运行多个函数中的任务:

        if __name__ == '__main__':
po = Pool(processes = 10)
resultslist = []
i = 1
while i <= 2:
arg = [i]
result = po.apply_async(getAllTimes, arg)
resultslist.append(result)
i += 1

feedback = []
for res in resultslist:
multipresults = res.get()
feedback.append(multipresults)

matchesBegin, matchesEnd = feedback[0][0], feedback[0][1]
TheTimes = feedback[1]

这对我来说效果很好。我目前正在使用它同时运行两项作业。

但问题是,在进入脚本的下一阶段之前,我并不总是需要完成所有两个同时运行的作业。有时,如果第一个作业成功完成,并且我能够通过验证 matchesBegin、matchesEnd 中的内容来确认它,我希望能够继续并终止另一个作业。

我的问题是,我不知道该怎么做。

作业 1 通常比作业 2 完成得快得多。所以,我在这里尝试做的是,如果作业 1 在作业 2 之前完成,并且作业 1 中的变量内容(matchesBegin、matchesEnd)为 True,那么,我希望工作 2 能够被淘汰,因为我不再需要它了。如果我不把它吹走,只会延长剧本的完成时间。仅当作业 1 的变量结果不为 True 时,才应允许作业 2 继续运行。

最佳答案

我不知道您的用例的所有细节,但我希望这能为您提供一些指导。本质上,您开始使用的 apply_async() 可以完成这项工作,但您还需要使用它的 callback 参数并评估传入的结果以查看它是否满足您的要求条件,如果符合则采取相应的措施。我对你的代码进行了一些修改并得到了这个:

class ParallelCall:
def __init__(self, jobs=None, check_done=lambda res: None):
self.pool = Pool(processes=jobs)
self.pending_results = []
self.return_results = []
self.check_done = check_done

def _callback(self, incoming_result):
self.return_results.append(incoming_result)
if self.check_done(incoming_result):
self.pool.terminate()
return incoming_result

def run_fce(self, fce, *args, **kwargs):
self.pending_results.append(self.pool.apply_async(fce,
*args, **kwargs,
callback=self._callback))

def collect(self):
self.pool.close()
self.pool.join()
return self.return_results

你可以这样使用:

def final_result(result_to_check):
return result_to_check[0] == result_to_check[1]

if __name__ == '__main__':
runner = ParallelCall(jobs=2, check_done=final_result)
for i in range(1,3):
arg = [i]
runner.run_fce(getAllTimes, arg)

feedback = runner.collect()

TheTimes = feedback[-1] # last completed getAllTimes call

它有什么作用? runnerParallelCall 的一个实例(注意:我只使用了两个工作线程,因为您似乎只运行了两个作业),它使用 final_result() 函数来评估结果是否是有效最终结果的合适候选者。在本例中,第一项和第二项相等。

我们使用它来启动 getAllTimes 两次,就像上面的示例一样。它像您一样使用 apply_async() ,但我们现在还注册了一个回调,通过该回调我们可以在结果可用时传递结果。我们还通过使用 check_done 注册的函数传递它,以查看是否获得了可接受的最终结果,如果是这样(返回值计算为 True),我们只需停止所有工作进程.

免责声明:这并不完全是您的示例所做的,因为返回列表不是按函数调用发生的顺序排列的,而是按结果可用的顺序排列的。

然后我们collect()将可用结果转化为反馈。此方法关闭池以不再接受任何进一步的任务 (close()),然后等待工作线程完成 (wait())(如果出现以下情况,它们可能会被停止)传入结果符合注册标准)。然后我们返回所有结果(直到匹配结果或直到所有工作完成)。

我已将其放入 ParallelCall 类中,以便我可以方便地跟踪待处理和已完成的结果,并了解我的池是什么。默认的 check_done 基本上是一个(可调用的)nop

关于python - 如果其中一个线程先结束,则结束python多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51370258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com