python - 打破 python 多处理管理器列表

标签 python multiprocessing

我正在执行一个流程,我想在 Manager.list() 达到一定数量时停止它,我该怎么做?

我的代码在这里,它不只是工作,有人可以帮忙吗?我不想使用线程。

from multiprocessing import current_process, cpu_count
from multiprocessing import Pool, Manager
import sys

# noinspection PyBroadException
def pool_process(value, _results):
    """
    Spreading work across a pool of Python Processes
    :param value: to be worked on
    :param _results: the array that holds them
    """
    try:
        _results.append(value)
    except:
        print "FATAL: %s running pool_process(%s, %s) exited with %s" % \
              (current_process().name, value, _results, sys.exc_info())


if __name__ == '__main__':
    pool = Pool(processes=cpu_count() * 2)
    pool_mgr = Manager()
    results = pool_mgr.list()

    for each in xrange(0, 1000):
        pool.apply_async(pool_process, [each, results])

    check = True

    while check:
        if len(pool_mgr.list()) == 100:
            check = False
            pool.close()
            pool.join()
            print len(pool_mgr)

最佳答案

我建议您尝试两件事:

if len(results) >= 100:

try:
    if len(_results) < 100:
        _results.append(value)
except:

问题是您正在并行处理。所以这些交易可能会发生:

if len(results) == 100: # 99
_results.append(value)
_results.append(value)
if len(results) == 100: # 101

您不仅希望在 100 处停止,而且您不希望超过 100 的值。因此您应该使用 >= 符号。

关于python - 打破 python 多处理管理器列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21736041/

相关文章:

python - 如何使用 multiprocessing.Pool.apply_async 记录到单个文件

python - 是否可以通过调试在 IPython 中运行命令?

python - 我怎样才能让 matplotlib 稍微移动重叠的曲线,这样它们就不会互相隐藏?

python - 使用 Python 同时下载一个文件的多个部分?

python多处理共享队列重新排序

python - 如何在 Python 中优化多处理

python - 并行运行单独的进程 - Python

Python mysql 复制客户端不显示值

python - 在算法信号中寻找周期性

python - 我可以使用 StreamHandler 在 Python 的多处理环境中登录吗?