#python #multithreading #dictionary #thread-safety #conflict
#python #многопоточность #словарь #безопасность потоков #конфликт
Вопрос:
У меня есть функция (например, myFunc), которая принимает начальную и конечную дату, выполняет итерации по ней и обращается к некоторым словарям для обработки данных за этот период времени. Я хочу использовать потоки для распараллеливания этого кода.
Моя функция main () считывает данные из множества файлов и сохраняет их в словарях. Каждый раз, когда я вызываю myFunc, я передаю эти словари и дату начала и окончания. Когда я вызываю myFunc, используя несколько потоков, и передаю одни и те же словари, возникнет ли конфликт? Эти словари используются только для чтения.
myFunc создает множество словарей, которые затем записывает в другой файл. Этот выходной файл будет отличаться для каждого потока, но поскольку во всех потоках словари называются одинаково, возникнет ли конфликт? Теоретически я понимаю, что концепция многопоточности означает, что конфликта не должно быть, если эти словари не являются глобальными. Но поскольку это моя первая попытка потоковой обработки, хотелось бы получить подтверждение.
Спасибо
Ответ №1:
С использованием потоков, нет, у вас не будет проблем. Вы также не добьетесь параллелизма. Глобальная блокировка интерпретатора (GIL) в Python позволяет обрабатывать только один поток в любое время. Если вы хотите настоящую параллельную обработку, вам нужно посмотреть на модуль многопроцессорной обработки. Он имеет возможность фактически использовать несколько процессоров на компьютере.
Комментарии:
1. Я этого не понимал. Спасибо. Если я использую модуль многопроцессорной обработки, будет ли ответ по-прежнему отрицательным на оба моих вопроса?
2. Именно то, что он сказал. Чтобы ответить на ваш вопрос напрямую, нет , конфликтов не будет. Чтобы лучше ответить на ваш вопрос, вы не можете добиться параллелизма в Python с помощью потоков; вам нужно использовать многопроцессорную обработку.
3. @user669815 — Ответом по-прежнему будет » нет » на оба вопроса. Ваш подход правильный, вы просто не можете использовать потоки.