使每个进程都可以访问全局变量

Making global variable accessible from every process

我是 python 的新手,开始使用遗传算法 (GA) 进行某种曲线拟合。对于那个 GA,我正在使用(很棒的)pyevolve 库 (http://pyevolve.sourceforge.net/) 能够通过使用多处理极大地减少计算时间。

这就是我的问题所在:我想要近似的曲线是一个从 excel 文件中读取并在我的程序开始时存储为全局变量的数组。使用 python 多处理模块时,每个进程都会使用自己的全局变量创建自己的 python 实例。这导致每个人,在算法的每一代(意味着每个进程)中一次又一次地打开和读取 excel 文件。打开大 excel 文件可能会花费大量时间,因此最好只打开该文件一次并使读取数组可供每个 process/individual.

使用

多处理是在pyevolve 库中启动的,我不想更改它以使其易于更新。不幸的是,这意味着只需将变量传递给进程池 例如

p = Process(target=my_func,args=(my_array))

不适合我。这是迄今为止我找到的唯一解决方案。

有谁知道另一种方法可以让每个进程都可以访问 my_array?

查看 mmap,Python 接口用于创建可在进程间共享的内存映射文件。您可能需要如下内容:

import mmap
import os
import ctypes

mm = mmap.mmap(-1, 13)
mm.write('Hello world!')

mm_addr = id(mm)

with open('shared_id', 'w') as f:
    f.write(str(mm_addr))

pid = os.fork()

if pid == 0:  # In a child process
    id_from_file = long(open('shared_id').read())
    loaded_mm = ctypes.cast(id_from_file, ctypes.py_object).value
    loaded_mm.seek(0)
    print loaded_mm.readline()
    loaded_mm.close()

我用 this 问题弄清楚如何获取共享内存映射的物理内存地址并将其转换回 Python 对象。

我想您也可以使用内存中的任何对象而不是 mmap 来执行此操作,但我还没有尝试过。

我只是想让你知道我是如何解决这个问题的,如果有人遇到这个问题的话:

我的解决方案不适用于一般的 python 相关问题,但它在使用 pyevolve 时有所帮助,这对我来说已经足够了。我不知道的是,在 pyevolve 中,您可以通过

向您的基因组或遗传算法实例添加参数

my_genome.setParams(xyz=my_array) 要么 my_ga.setParams(xyz=my_array)

并且可以通过

访问这些参数

my_genome.getParam('xyz')my_ga.getParam('xyz')

每个进程都可以访问这些参数,所以我的问题得到解决,我不需要考虑一般的 python 多处理问题。 我希望这对其他人有帮助!