更新和引用全局列表
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]
当然,输出会有所不同,因为它取决于进程终止的顺序
我正在 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]
当然,输出会有所不同,因为它取决于进程终止的顺序