我正在使用Python 3.8的新模块
创建并使用共享内存块
并且(2)Windows 似乎会在创建/使用共享内存的进程停止后释放它(请参见这里和这里的评论)。这可能是 Python 没有显式处理此问题的原因。
为此,我建立了一个丑陋的解决方法,通过反复保存和重用同一共享内存块而不断开链接。显然,这不是一个令人满意的解决方案,特别是当所需内存块的大小动态变化时。
有没有办法在 Windows 上手动释放共享内存?
shared_memory
,但在没有终止使用它的进程的情况下无法释放共享内存。创建并使用共享内存块
shm
后,在所有进程中通过shm.close()
关闭它,并最终在主进程中通过shm.unlink
释放它。然而,资源监视器显示,直到程序终止,内存没有被释放。这对我来说是一个严重的问题,因为我的程序需要长时间运行。该问题可以在Windows/Python 3.8上使用以下程序进行重现:from multiprocessing import shared_memory, Pool
from itertools import repeat
from time import sleep
def fun(dummy, name):
# access shared memory
shm = shared_memory.SharedMemory(name=name)
# do work
sleep(1)
# release shared memory
shm.close()
return dummy
def meta_fun(pool):
# create shared array
arr = shared_memory.SharedMemory(create=True, size=500000000)
# compute result
result = sum(pool.starmap(fun, zip(range(10), repeat(arr.name))))
# release and free memory
arr.close()
arr.unlink()
return result
if __name__ == '__main__':
# use one Pool for many method calls to save the time for repeatedly
# creating processes
with Pool() as pool:
for i in range(100):
print(meta_fun(pool))
注意:执行此脚本时,您可能会很快填满整个内存!请在资源监视器中观察“虚拟内存”面板。
经过一些研究,我发现(1)unlink()
函数在Windows上不起作用:
def unlink(self):
"""Requests that the underlying shared memory block be destroyed.
In order to ensure proper cleanup of resources, unlink should be
called once (and only once) across all processes which have access
to the shared memory block."""
if _USE_POSIX and self._name:
from .resource_tracker import unregister
_posixshmem.shm_unlink(self._name)
unregister(self._name, "shared_memory")
并且(2)Windows 似乎会在创建/使用共享内存的进程停止后释放它(请参见这里和这里的评论)。这可能是 Python 没有显式处理此问题的原因。
为此,我建立了一个丑陋的解决方法,通过反复保存和重用同一共享内存块而不断开链接。显然,这不是一个令人满意的解决方案,特别是当所需内存块的大小动态变化时。
有没有办法在 Windows 上手动释放共享内存?