Задать вопрос
@Sanderses
student

Как изменить глобальную переменную (list)?

Есть глобальный список 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)
  • Вопрос задан
  • 173 просмотра
Подписаться 2 Простой 7 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы