Python多处理子过程无法访问全局变量



我创建了pandas dataframe的全局变量。我希望子流程可以访问全局数据框架,但是看来子过程无法获得全局变量。

data = pd.DataFrame(data = np.array([[i for i in range(1000)] for j in range(500)]))
def get_sample(i):
    print("start round {}".format(i))
    sample = data.sample(500, random_state=i)
    xs = sample.sum(axis=0)
    if i < 10:
        print(data.shape())
        print(sample.iloc[:3, :3])
    print("rount{} returns output".format(i))
    return xs
samples = []
def collect(result):
    print("collect called with {}".format(result[0][0].shape))
    global samples
    samples.extend(result)
ntasks = 1000
if __name__=='__main__':
    samples = []
    xs = pd.DataFrame()
    """sampling"""
    pool = mp.Pool(cpu_count(logical=True))
    print("start sampling, total round = {}".format(ntasks))
    r = pool.map_async(get_sample, [j for j in range(ntasks)], callback=collect)
    r.wait()
    pool.close()
    pool.join()
    xs = pd.concat([sample for sample in samples], axis = 1, ignore_index=True)
    xs = xs.transpose()
    print("xs: ")
    print(xs.shape)
    print(xs.iloc[:10, :10])

全局数据帧是数据。我期望在每个子过程中,函数get_sample可以访问数据并从数据中检索一些值。为了确保子进程可以获取数据,我在每个子过程中打印出数据形状。问题在于,看来子进程无法获取数据,因为当我运行它时,没有数据形状的打印或示例部分。

此外,我收到错误:Trackback(最近的最新电话(: 文件" sampling2c.py",第51行,in xs = pd.concat([样品中的样本],轴= 1,ignore_index = true( 文件"/usr/usc/python/3.6.0/lib/python3.6/site-packages/pandas/pandas/tools/merge.py.py",第1451行,在Concat中 复制=复制( 文件"/usr/usc/python/3.6.0/lib/python3.6/site-packages/pandas/tools/merge.py" 提高价值Error("无对象的对象"(似乎get_sample函数没有返回任何内容,采样失败。

但是,当我进行了一个实验以测试儿童过程是否可以访问全局变量时,它起作用。

df = pd.DataFrame(data = {'a':[1,2,3], 'b':[2,4,6]})
df['c1'] = [1,2,1]
df['c2'] = [2,1,2]
df['c3'] = [3,4,4]
df2 = pd.DataFrame(data = {'a':[i for i in range(100)], 'b':[i for i in range(100, 200)]})
l = [1, 2, 3]
Mgr = Manager()
results = []
def collect(result):
    global results
    #print("collect called with {}".format(result))
    results.extend(result)
counter = 12
def sample(i):
    print(current_process())
    return df2.sample(5, random_state = i)
if __name__=='__main__':
    pool = Pool(3)
    r = pool.map_async(sample, [i for i in range(3)], callback = collect) #callback = collect
    r.wait()
for res in results:
    print(res)

每个子过程都可以访问全局变量DF2。我不确定为什么儿童处理无法在代码的第一个块中访问数据。

当您使用多处理产生过程时,您的新过程在产卵时将获得状态的副本。

如果要在父进程或其他同胞过程之间传达数据,则可以使用共享变量或处理共享对象的服务器进程进行操作。有关详细信息,请参阅"共享"过程中的过程

如果您使用线程,则各个线程全部在同一上下文中运行,共享所有全局变量。因此,您可以在所有线程和主循环中访问所有全局变量,而无需做任何特别的事情。

既有线程和多处理,都有其优点和缺点,但这不是讨论这些的地方。

相关内容

  • 没有找到相关文章

最新更新