更新和引用全局列表

Updating and refering to a global list

我正在 python 中编写脚本,但遇到了一些问题。我正在尝试拥有一个全局列表,一些已定义的函数引用并附加到该列表。这些函数是递归的,运行 使用多处理并行,一些函数使用实时数据更新列表,然后其他函数获取该数据以用于其他计算。但是,由于某种原因,似乎只有更新函数中的本地列表得到更新,而全局列表仍为空。这是我正在尝试执行的操作的过度简化示例:

log = []
avGradLog = []

def UpdateLog():
    data = get_data
    log.append(data)
    time.sleep(dt)
    UpdateLog()

def ReferToLog():
    m = gradient(log[chosen_point], log[chosen_point2]) #defined elsewhere
    avGradLog.append(m)
    time.sleep(dt)
    ReferToLog()

请记住,我来自理论物理学背景,所以我的 CS 知识非常缺乏,在网上找不到太多,如果这是一个非常初级的问题,我深表歉意。

提前谢谢你, 托尼.

如果您想在进程中修改列表,您需要记住此类进程 运行 在离散地址空间中。这是一个演示您可能出错的地方的示例:

from multiprocessing import Pool

alist = []

def func(n):
    global alist
    alist.append(n)

def main():
    with Pool() as pool:
        args = [(i,) for i in range(10)]
        pool.starmap_async(func, args).wait()
    print(alist)
if __name__ == '__main__':
    main()

输出:

[]

您可以这样做:

from functools import partial
from multiprocessing import Pool, Manager

def func(alist, n):
    alist.append(n)

def main():
    with Manager() as manager:
        alist = manager.list()
        with Pool() as pool:
            args = [(i, ) for i in range(10)]
            pool.starmap_async(partial(func, alist), args).wait()
        print(alist)
if __name__ == '__main__':
    main()

输出:

[0, 7, 2, 1, 3, 4, 5, 8, 6, 9]

当然,输出会有所不同,因为它取决于进程终止的顺序