当前位置: 首页 > 面试题库 >

Python多进程池。当工作进程之一确定不再需要执行更多工作时,如何退出脚本?

锺离赤岩
2023-03-14
问题内容
mp.set_start_method('spawn')
total_count = Counter(0)
pool = mp.Pool(initializer=init, initargs=(total_count,), processes=num_proc)

pool.map(part_crack_helper, product(seed_str, repeat=4))
pool.close()
pool.join()

因此,我有一组工作人员在做一些工作。它只需要找到一个解决方案。因此,当一个工作进程找到解决方案时,我想停止一切。

我想到的一种方法是只调用sys.exit()。但是,由于其他进程正在运行,因此似乎无法正常工作。

另一种方法是检查每个进程调用的返回值(part_crack_helper函数的返回值),然后在该进程上终止调用。但是,我不知道在使用该map函数时该怎么做。

我应该如何实现?


问题答案:

您可以使用中的回调Pool.apply_async

这样的事情应该可以为您完成工作。

from multiprocessing import Pool


def part_crack_helper(args):
    solution = do_job(args)
    if solution:
        return True
    else:
        return False


class Worker():
    def __init__(self, workers, initializer, initargs):
        self.pool = Pool(processes=workers, 
                         initializer=initializer, 
                         initargs=initargs)

    def callback(self, result):
        if result:
            print "Solution found! Yay!"
            self.pool.terminate()

    def do_job(self):
        for args in product(seed_str, repeat=4):
            self.pool.apply_async(part_crack_helper, 
                                  args=args, 
                                  callback=self.callback)

        self.pool.close()
        self.pool.join()
        print "good bye"


w = Worker(num_proc, init, [total_count])
w.do_job()


 类似资料:
  • 问题内容: 我正在尝试使用Process对象在python中使用工作池。每个工作人员(一个流程)进行一些初始化(花费很短的时间),传递一系列的工作(最好使用),然后返回一些信息。除此之外,没有必要进行任何沟通。但是,我似乎无法弄清楚如何使用map()使用工作人员的函数。 是代替工作队列吗,还是可以使用? 问题答案: 我建议您为此使用队列。 现在您可以开始一堆这些工作,所有工作都从一个队列开始 这种

  • 问题内容: 我正在使用ProcessBuilder启动子进程,并且如果父进程确实需要退出子进程。在正常情况下,我的代码可以正确阻止孩子。但是,如果我导致操作系统杀死父进程,则子进程将继续运行。 有什么方法可以将子进程“绑定”到父进程,以便在父进程被杀死时退出? 问题答案: 子进程与其父进程之间没有联系。他们可能彼此知道进程ID,但是它们之间没有硬连接。您在谈论孤立过程。这是操作系统级别的问题。意味

  • 本文向大家介绍详解python之多进程和进程池(Processing库),包括了详解python之多进程和进程池(Processing库)的使用技巧和注意事项,需要的朋友参考一下 环境:win7+python2.7 一直想学习多进程或多线程,但之前只是单纯看一点基础知识还有简单的介绍,无法理解怎么去应用,直到前段时间看了github的一个爬虫项目涉及到多进程,多线程相关内容,一边看一边百度相关知识

  • 问题内容: 我处在一个困难的情况下,我不知道一个进程需要什么Linux功能才能工作。最好的方法是什么,或者找出所需的上限的任何方法? 我现在唯一能想到的就是使用capsh并降低进程中的所有上限。然后,该过程失败,我开始添加上限(通过删除–drop = CAP_XZY),直到它起作用为止。 还有更好的建议吗? 问题答案: 我之前在Brendan Gregg的这篇博客文章中遇到的另一种方法是使用功能跟

  • 基于文档https://netty . io/4.1/API/io/netty/channel/channel pipeline . html:< br > //告诉管道在与I/O线程不同的线程中运行MyBusinessLogicHandler的事件处理程序方法 //,这样I/O线程就不会被 //阻塞,这是一项耗时的任务。 //如果您的业务逻辑是完全异步的或很快就完成了,您不需要指定一个组。 pi

  • 我的问题是。。。为什么选择completionLock。run方法中的lock()未锁定资源。当我在系统中运行程序时。出来println(Thread.currentThread())。getName()) 我得到以下输出:Thread-1 Thread-0 Thread-0 Thread-1 NoLock ATM:130 Locked ATM:160应该是:160程序终止。 还有什么是等到完成才