Как очистить (освободить память) при использовании multiprocessing.Array() в python?

#python #python-3.x #multiprocessing #ctypes #free

#python #python-3.x #многопроцессорная обработка #ctypes ( типы ) #Бесплатно #ctypes

Вопрос:

Я использую multiprocessing.Array() для создания общей памяти с моим родительским и дочерним процессом (запущенным с помощью multiprocessing.Process() ). Я хотел бы free() сохранить память, которая была выделена для массива ctypes с помощью Array() . Как я могу это сделать?

Рассмотрим следующий пример скрипта python, который определяет простую helloWorld() функцию, которая принимает массив байтов в общей памяти и сохраняет в нем «hello world!».

 #!/usr/bin/env python3
import multiprocessing

# this function will be executed in a child process asynchronously
def helloWorld( shm_string ):
    shm_string.value =  bytes( 'hello world!', 'utf-8' )

# alloc()
shm_string = multiprocessing.Array( 'c', 256 )

# execute the helloWorld() function in a child process in the background
process = multiprocessing.Process(
 target = helloWorld,
 args = (shm_string,),
)
process.start()

# <this is where async stuff would happen>

# wait for the process to finish
# and free() the resources allocated for the Process()
process.join()

# get the string out of shared memory
result = shm_string.value.decode( 'utf-8' )
print(result)

# free()
#free(shm_string)??
  

Как вы можете видеть выше, функция helloWorld() выполняется в дочернем процессе с использованием multiprocessing.Process() , и она передает наш массив байтов в общую память.

Вот пример выполнения:

 user@host:~$ python3 example3.py 
hello world!
user@host:~$ 
  

Как я могу обновить приведенный выше скрипт до фактически free() памяти, которая была выделена для массива байтов (на который ссылается shm_string ) после того, как он нам больше не понадобится?

Комментарии:

1. Разве сборщик мусора, который заботится об освобождении этого ресурса один раз, больше не используется?

2. Я бы не ожидал, что сборщик мусора освободит ресурсы, которые все еще назначены переменной! Я подумал, что, возможно, настройка shm_string = None удалит все ссылки на память и вызовет GC для освобождения памяти. Если это правда, то, пожалуйста, опубликуйте это как решение. Но обязательно докажите это, показав, что память выделена до shm_string = None , подождите некоторое время, а затем докажите, что память больше не выделяется. В моем не упрощенном случае shm_string на самом деле является долгоживущим полем экземпляра объекта.