Есть глобальный список pages. В функции extract_imgs я объявляю его как глобальную переменную и добавляю в него элементы (в моем случае картинки). Далее создаю новые процессы, которые обращаются к этому глобальному списку и извлекают данные. Но при обращении к нему, он остается пустым, будто в функции extract_imgs он не изменился. Как это исправить? Передавать его в качестве аргумента в каждый процесс не вариант, так как, как я понял, они копируются во все новые процессы. А сам список довольно большой и если его несколько раз скопировать, то мне не хватит оперативной памяти.
Пробовал не запускать новые процессы, а вызвать просто как функцию, в это случае список не пуст.
name_number = 1
pages = []
n_threads = 6
def extract_imgs(pdf_path=None,
output_folder=join(base_path, 'images_from_pdf'),
dpi=310,
fmt='jpeg'):
global pages
# ...................
try:
pages += convert_from_path(pdf_path=pdf_path,
# output_folder=output_folder,
dpi=dpi,
fmt=fmt,
thread_count=4)
finally:
print('*Error convert {}'.format(pdf_path))
procs = []
loc_pages = Lock()
lock_number_name = Lock()
for i in range(n_threads):
proc = Process(target=prepare_img, name='PROC_{}'.format(i + 1),
args=(loc_pages, lock_number_name, hr_path, lr_path, fmt))
procs.append(proc)
proc.start()
for proc in procs:
proc.join()
print('End of saving')
def prepare_img(loc_pages, lock_number_name, hr_path, lr_path, fmt):
global name_number
global pages
while True:
loc_pages.acquire()
try:
if len(pages) == 0:
print('len == 0') # С самого начала процесс попадает в этот if, хотя список не должен быть пустым.
break
page = np.array(pages.pop())
finally:
loc_pages.release()
# .............
print("Done", current_process().name)
if __name__ == '__main__':
extract_imgs(pdf_path=join(base_path, 'p.pdf'), output_folder=base_path)