使用生成器在python中执行线程

使用生成器在python中执行线程,python,multithreading,generator,python-multithreading,brute-force,Python,Multithreading,Generator,Python Multithreading,Brute Force,我正在创建一个算法,该算法使用生成器对象强制搜索3x3矩阵的条件,以创建所有可能的组合。目前,在单个线程上运行它所需的时间将花费大量的时间,但是我可以访问一台具有多个内核(64个)的计算机,因此将其线程化为至少20个线程将是一个非常可行的选择 但是,我不能简单地将generator对象转换为列表,并将列表拆分为大小相等的块。存储列表所需的RAM量太大 我的单线程方法(问题简化)如下: def permute(xs, low=0): if low + 1 >= len(xs):

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

但是,我不能简单地将generator对象转换为列表,并将列表拆分为大小相等的块。存储列表所需的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)
有什么好的方法来处理这个问题

  • 即使您有多个线程,它们仍将处于同一进程中,该进程将仅在单个内核上执行

  • 与其将数据分割成固定数量的相等块,为什么不动态创建一组批呢?例如,你可以

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


    编辑:我会试试这个->

    线程对你没有帮助。Python中的多线程很糟糕,因为Python的标准实现有各种各样的线程不友好设计,并且需要一个全局解释器锁来确保同时执行的线程不会破坏解释器内部。这意味着它几乎是一次一个线程。您可以尝试多处理模块,该模块使用多个完整的Python进程来绕过锁,也可以尝试更为线程友好的语言。请参阅@user2357112我将查看服务器上安装了哪些其他编程语言,以便今晚使用。我想你链接错页面了,大津。你是说?关于单一核心问题的观点很好。我也将尝试您的建议,但我完全忘记了,这与多个Python进程结合起来应该使我能够以最小的瓶颈利用适当的多线程。