2015-03-03 3 views
2

Я хочу разрешить различным потокам вносить изменения в разные элементы значения, приобретая блокировки только для этих элементов, а не для всего объекта.Как разрешить нескольким потокам изменять разные части объекта с помощью блокировок в Python?

Например: Рассмотрим словарь -

D = {1:[time, speed, distance],2:[time1,speed1, distance1], 3:[time2, speed2, distance2]}

Thread T1 изменить D[1][0], нить T2 изменить D[1][1], нить T3 изменить D[2][2] и т.д., поэтому T1 должен зафиксировать D[1][0], T2 должен зафиксировать D[1][1]. T3 должен блокировать D[2][2] и изменять их одновременно.

+1

Изменяется ли структура dicts или только значения (списки)? – shx2

+0

Только списки. Длина списка остается такой же, но я хотел бы обновить элементы списка. – Deepika

ответ

2

В Python есть Global Interpreter Lock, поэтому вам не придется беспокоиться о блокировке. Вы не получите выгоды от многопоточности, по крайней мере, не так, как вы можете использовать с Java или C.

Короче говоря, только один поток за раз запускает код Python. если вы привязаны к вводу/выводу (например, к сети), это решение, которое вы хотите. Если вы связаны с CPU (например, вычислениями), используйте либо собственные модули, либо посмотрите на модуль многопроцессорности.

+0

Из-за GIL нескольким потокам не разрешается выполнять одну и ту же часть кода. Мой вопрос касается потоков, выполняющих разные части кода, но имеющих доступ к изменяемому объекту. Или я неправильно понял GIL? – Deepika

+0

GIL гарантирует, что * интерпретатор * работает сериализован. По крайней мере, в CPython интерпретатор совпадает с процессом. Если объект используется совместно с нативным кодом, вам придется взять GIL, прежде чем модифицировать его. – Krumelur

 Смежные вопросы

  • Нет связанных вопросов^_^