Я работаю над сегментацией больших массивов ctype и их параллельной обработкой. Я получаю приведенную ниже ошибку и верю ей, потому что один сегмент массива завершает обработку раньше другого. Я попытался использовать process.join (), чтобы первый набор процессов ждал, но это не работает. Идеи?
Exception RuntimeError: RuntimeError('cannot join current thread',) in <Finalize object, dead> ignored
Использование:
....
with closing(multiprocessing.Pool(initializer=init(array))) as p:
del array #Since the array is now stored in a shared array destroy the array ref for memory reasons
step = y // cores
if step != 0:
jobs =[]
for i in range (0, y, step):
process = p.Process(target=stretch, args= (shared_arr,slice(i, i+step)),kwargs=options)
jobs.append(process)
process.start()
for j in jobs:
j.join()
del jobs
del process
Обновление:
#Create an ctypes array
array = ArrayConvert.SharedMemArray(array)
#Create a global of options
init_options(options) #options is a dict
with closing(multiprocessing.Pool(initializer=init(array))) as p:
del array #Since the array is not stored in a shared array destroy the array ref for memory reasons
step = y // cores
if step != 0:
for i in range (0, y, step):
#Package all the options into a global dictionary
p.map_async(stretch,[slice(i, i+step)])
#p.apply_async(stretch,args=(shared_arr,slice(i, i+step)),kwargs=options)
p.join()
def init_options(options_):
global kwoptions
kwoptions = options_
Функция, которую я передаю асинхронной карте _, хранится в другом модуле, поэтому я изо всех сил пытаюсь передать глобальные kwooptions этой функции. Кажется неправильным передавать глобальные переменные между модулями, как этот (unpythonic ). Это способ передачи kwargs через карту _async.
Должен ли я перерабатывать многопроцессорность, используя что-то другое (apply или Process )?