使用生成器在python中进行线程化

时间:2015-12-15 18:24:51

标签: python multithreading generator python-multithreading brute-force

我正在创建一种算法,使用生成器对象来强制搜索3x3矩阵的条件以创建所有可能的组合。目前,在单个线程上运行它所需的时间将花费大量时间,但是我可以访问具有多个内核的计算机(64),因此将其线程化至少具有20个线程将是非常可行的选项。

但是,我不能简单地将生成器对象转换为列表并将列表拆分为相同大小的块。存储列表列表所需的RAM量太高了。

我的单线程方法(简化问题)如下:

def permute(xs, low=0):
    if low + 1 >= len(xs):
        yield xs
    else:
        for p in permute(xs, low + 1):
            yield p     
        for i in range(low + 1, len(xs)):       
            xs[low], xs[i] = xs[i], xs[low]
            for p in permute(xs, low + 1):
                yield p     
            xs[low], xs[i] = xs[i], xs[low]

generator_obj = permute(range(9))
for l in generator_obj:
    search_conditions(l)

什么是线程化的好方法?

1 个答案:

答案 0 :(得分:2)

  1. 即使你有多个线程,它们仍然会在同一个进程中,只能在一个核心上执行。

  2. 为什么不动态创建一组批次,而不是将数据拆分成固定数量的相等块?例如,你可以

    • 使用生成器创建要处理的项目列表,该列表将足够小以避免填充RAM的任何危险,
    • 使用以下建议: https://stackoverflow.com/a/1269055/3366796
    • 或使用picklemsgpack或数据库
    • 将列表列表保存到磁盘
    • 然后,使用单独的脚本,使用subprocess.Popen处理每个批处理并将结果写回磁盘
    • 等待进程完成,然后让另一个例程汇总结果
  3. 这种方法将使用多核系统的强大功能,但应该考虑确保磁盘不会成为瓶颈。

    编辑:我会尝试这个 - > http://www.dabeaz.com/coroutines/coprocess.py