进程完成后如何停止python多处理服务器

进程完成后如何停止python多处理服务器,python,multiprocessing,distributed-computing,Python,Multiprocessing,Distributed Computing,我试图使用python的多处理模块在几台机器上运行分布式任务,我一直在使用它作为参考 但是,本文的任务使用作业队列,并将结果放入结果队列,这两个队列都由JobQueueManager(SyncManager的子类)管理。此管理器有一个服务器,当它调用manager.shutdown()时,该服务器将启动并持续运行,直到结果队列填满为止 我的问题是,我的任务不需要结果队列,因此我试图找出如何知道何时停止服务器。我可以让服务器持续运行永远服务,然后手动停止,或者创建一个虚拟队列,以与示例中相同的方式

我试图使用python的多处理模块在几台机器上运行分布式任务,我一直在使用它作为参考

但是,本文的任务使用作业队列,并将结果放入结果队列,这两个队列都由JobQueueManager(SyncManager的子类)管理。此管理器有一个服务器,当它调用
manager.shutdown()
时,该服务器将启动并持续运行,直到结果队列填满为止

我的问题是,我的任务不需要结果队列,因此我试图找出如何知道何时停止服务器。我可以让服务器持续运行
永远服务
,然后手动停止,或者创建一个虚拟队列,以与示例中相同的方式填充,并在服务器达到原始作业数时停止服务器

我不希望手动停止它,但第二种解决方案似乎相当粗糙。在没有服务器的情况下,似乎有一种常见的方法是对每个进程调用
join()
,但我不知道管理器是否有办法找出哪个进程从队列中删除了每个作业

我的回退计划是虚拟队列方法的一个变体,但有一个共享计数器变量,该变量在每个进程的最后一步递增,但我想知道是否有任何建议使用来自多处理库的方法,或者这是否不可靠

谢谢

编辑:我没有提到我不使用结果队列的原因是我正在将处理结果存储到Redis数据库中。

在给出的示例中:

outdict = shared_result_q.get()

结果队列用于异步等待结果。这是沟通的主要方法。没有它,您需要另一种信号机制来确认任务结束事件。只需将
None
放入队列。

正如我的更新所示,我已经使用redis数据库来存储任务的结果,因此我不必担心在不同的机器之间管理dict

我最终使用的解决方案也使用了Redis db。每当完成每个进程时,我都会让它将一个包含进程信息的字符串推送到列表中(
r\u server.lpush(…)
in)。在服务器端,我没有对结果队列使用blocking
get
方法,而是使用Redis'blocking pop
rs.blpop()
,其工作方式与此相同


这与博客文章和这里的其他建议非常相似,即创建一个虚拟队列并使用
get()
,但只使用redis,这样我就不会有额外的方法参数和向管理器注册额外方法的开销。

为什么不添加一个结果队列呢。你只需要输入一个布尔值。