#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
на самом деле является долгоживущим полем экземпляра объекта.