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

时间:2016-06-01 13:45:27

标签: python multiprocessing global pyevolve

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

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

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

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

对我来说不是一个选择。这是我到目前为止找到的唯一解决方案。

有没有人知道从每个进程访问my_array的另一种方法?

提前致谢!

2 个答案:

答案 0 :(得分:0)

查看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,但我还没有尝试过。

答案 1 :(得分:0)

我只是想让你知道如果其他人面对这个问题我是如何解决这个问题的:

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

为基因组或遗传算法实例添加参数

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

可以通过

访问这些参数

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

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