• Добро пожаловать на Форум пользователей ПО АСКОН. Пожалуйста, авторизуйтесь.
 

Уважаемые пользователи,

Хотим проинформировать вас о режиме работы регистрации на нашем сайте.

Зарегистрироваться возможно в рабочие дни, с 8:00 до 20:00 (мск).

Если у вас возникнут вопросы или потребуется дополнительная информация, не стесняйтесь обращаться к нашей службе поддержки. Вы можете связаться с нами по указанным контактным данным на нашем сайте.

Благодарим вас за понимание и сотрудничество. Мы ценим ваше терпение и стремимся предоставить вам лучший опыт использования нашего сервиса.

С уважением,
Команда Ascon

Зачем нужен threading.Lock() ?

Автор feron, 22.10.24, 13:26:17

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

feron

Добрый день!

Не раз видел такую часть кода:

import threading
lock = threading.Lock()
dataListObj == []

// и где то в функциях которые работают в пуле потоков

with lock:
    dataListObj.append(result)

Но зачем так делать?

Lemieux

Конкурентный доступ к данным в многопоточных приложениях.
+ Благодарностей: 1

feron

Цитата: Lemieux от 22.10.24, 13:44:51Конкурентный доступ к данным в многопоточных приложениях.

Да, но зачем ? это разве не замедляет скорость помноженное на количество раз запуска ?
Почему без этой конструкции не обойтись ?

Lemieux

Цитата: feron от 22.10.24, 13:58:58Да, но зачем ? это разве не замедляет скорость помноженное на количество раз запуска ?
Почему без этой конструкции не обойтись ?
Так Вы бы почитали, о чём я написал.
Если кратко. Например есть общие ресурсы, допустим массив, с которым работает N-е количество задач, запущенных в разных потоках. Нам нужно уберечься от того, что пока одна задача работает с элементом массива, другая задача не изменила его.
Вы можете спросить исходники saveraster у UU, и посмотрите как он реализовал конвертацию в несколько потоков.

feron

#4
Цитата: Lemieux от 22.10.24, 14:07:03Вы можете спросить исходники saveraster у UU, и посмотрите как он реализовал конвертацию в несколько потоков.

ага, он прям взял и скинул  :-)))

Не не дело в том что я убрал эту конструкцию и все работает также..

Цитата: Lemieux от 22.10.24, 14:07:03Если кратко. Например есть общие ресурсы, допустим массив, с которым работает N-е количество задач, запущенных в разных потоках. Нам нужно уберечься от того, что пока одна задача работает с элементом массива, другая задача не изменила его.
я об этом так же и подумал, но там скорее всего есть своя очередь обработки этой переменной или нет ? вот например недавно сталкивался с скоростью записи на диск приложением, однако приложение не делает запись на диск на прямую..

Другое дело доступ к файлу на запись тут я согласен с этой конструкцией.

Lemieux

Цитата: feron от 22.10.24, 14:26:41Не не дело в том что я убрал эту конструкцию и все работает также..
Смотря какой контекст. Вот если у Вас не будет работать в многопоточности, то это будут танцы с бубном.

Цитата: feron от 22.10.24, 14:26:41я об этом так же и подумал, но там скорее всего есть своя очередь обработки этой переменной или нет ?
Гуглите о контексте приложения, мьютексах, семафорах, async/await.

Цитата: feron от 22.10.24, 14:26:41Другое дело доступ к файлу на запись тут я согласен с этой конструкцией.
Многопоточные операции ввода/вывода это чуть другое.
+ Благодарностей: 1

feron

#6
Цитата: Lemieux от 22.10.24, 14:48:16Гуглите о контексте приложения, мьютексах, семафорах, async/await.

Повторюсь - ведь python учел это в своем конструкции интерпретатора или нет ?

ответ: нет

There's no intermediate "queue" mechanism built into Python that would serialize these operations for you. If multiple threads modify the resource simultaneously without protection, you could encounter race conditions, where the final state of the data depends on the order in which the threads executed, leading to unpredictable results.

p3452

Цитата: feron от 22.10.24, 13:26:17Но зачем так делать?
"Threading.Lock обеспечивает более высокую производительность по сравнению с традиционным классом Monitor. Это приводит к улучшению производительности в многопоточных приложениях. Для ещё большего повышения производительности рекомендуется удерживать блокировку в течение максимально короткого времени, чтобы сократить число конфликтов при блокировке."
+ Благодарностей: 2

Vi2

Цитата: p3452 от 22.10.24, 18:51:14Threading.Lock обеспечивает более высокую производительность по сравнению с традиционным классом Monitor.
Вряд ли, там дело работы в нескольких строк. А вот без него геморроя предостаточно. "Вот же работает", значит, не попадает в критическую ситуацию. Но она не за горами. Или от многопоточности фиг да маленько.

PS
Правда, это не помогает/уберегает от повторно-входимых программ, которых при многопоточности много.

feron

Цитата: Vi2 от 23.10.24, 13:46:22Правда, это не помогает/уберегает от повторно-входимых программ, которых при многопоточности много.
А что же тогда поможет?