LINUX.ORG.RU

Python, разделяемый между тредами объект


0

0

ЯП: Python 2.х

Задача: обеспечить доступ к хеш-таблице из 2 потоков

Проблема: при использовании threading.Thread() каждый тред получает копию этой таблицы

Предполагаемые решения: POSH, но смущает то, что последняя версия датируется мартом 2003 года. shm_wrapper, но сильно не хочется постоянно сериализовывать и десериализовывать таблицу

Вопрос: как решить проблему?


Ерунда какая-то. Объекты общие для всех тредов. Покажи код.

const86 ★★★★★
()

import threading

threading.RLock()

это так на первую вскидку

real_maverick ★★★
()

>Проблема: при использовании threading.Thread() каждый тред получает копию этой таблицы

Хм, а как это проверялось? Вроде в питоне dict передаётся по ссылке в треды.

anonymous
()

lock = threading.Lock()
with nested (hash_table, lock) as (hash_tab, locked):
...

kto_tama ★★★★★
()

может немного не в тему но в целом смысл tread-библиотеки очень сомнительный - она не работает параллельно изза так называемой глобальной блокировки интерпретатора - проверял лично - вроде все в потоках но грузится только одно ядро . надо использовать или pp(parallel pyton) или другую библиотеку processing ( она основан на fork) но синтаксис очень сход с tread. в документации processing есть пример использования общего словаря.

Astin
()

Прошу прощения, и правда к словарю есть доступ из обоих тредов, моя неправда. Вроде как не было, ну да ладно

А про то, что threading использовать не надо, уже подумал. Остановился на os.fork(), но теперь почитаю про processing

Всем участвовавшим в обсуждении большое спасибо

hc
() автор топика
Ответ на: комментарий от hc

Посмотрел документацию по processing... Нет, мне таки, вероятнее всего, нужен fork. Поскольку у меня эти 2 процесса/потока должны работать со словарём с разной логикой (один записи только изменяет, второй только считывает)

//В общем-то задача обычная для системного администратора - пишу биллинг свой :) radius, pppoe и всё прочее прилагаются :) Этот вопрос возник из-за того, что как-то надо поддерживать таблицу соответствия IP-пользователь, да ещё желательно так, чтобы алгоритм, считающий то, что выплёвывает коллектор netflow, не блокировался для прослушивания сокета. Или есть хитрые асинхронные сокеты? twisted не предлагать ;)

hc
() автор топика
Ответ на: комментарий от hc

1) Используйте только мультипроцессинг. Треадинг в пайтоне это как HT на P4. Вроде как работает всё параллельно, но в действительности оно не так. Попробуй в одном потоке взять 42389748923 в степень 34234732547 и пойми всю ущербность потоков в пайтоне.
Основной функционал(почти весь) у потоков и мультипроцессинга в пайтоне идентичен. Просто 1 в 1.
2) G: Мьютексы
Это для теории.
http://docs.python.org/library/multiprocessing.html#multiprocessing.RLock
Вообще, в пайтоне есть модуль мьютекс в чистом виде, но я его не юзал. Юзай локеры.

tia
()
Ответ на: комментарий от Astin

>может немного не в тему но в целом смысл tread-библиотеки очень сомнительный - она не работает параллельно изза так называемой глобальной блокировки интерпретатора - проверял лично - вроде все в потоках но грузится только одно ядро .

Это смотря какая задача. В гуях треды часто бывают нужны и они удобнее форков. Плюс бывают задачи, где нужно параллельное выполнение процессов и производительность не имеет большого значения.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.