Блог Толика Вострякова

Живой опыт программирования, Python, Django, современные языки и немного фотографий
Блог - новые записи и ссылки (Atom)

Игры с Manager, Lock из multiprocessing модуля -

В одном проекте я использовал redis для хранения статистики, собираемой из нескольких процессов python на одной машине. Статистика складывалась в redis в hash или словарь. Попробовал заменить место хранения на словарь в питоне и вот, что из этого вышло:

from multiprocessing import Pool, Manager, Lock

lock = Lock()
manager = Manager()
stats_dict = manager.dict()

Проще не получилось, так как в разделяемой памяти (Shared Memory) нету такого класса, как словарь в multiprocessing модуле. Код, демонстрирующий использование:

def save_stats(x):
    lock.acquire()
    if not stats_dict.has_key('test'):
        stats_dict['test'] = 0
    for i in range(100):
        stats_dict['test'] += 1
    lock.release()

if __name__ == "__main__":
    pool = Pool(processes=4)
    pool.map(save_stats, [1, 2, 4, 5])

    print stats_dict

Как видим одновременно запускаются четыре процесса, выполняющие процедуру save_stats. После окончания, в поле 'test' окажется 400. Никаких race conditions. Вот думаю теперь насколько это лучше просто redis. Выглядит примерно одинаково по эффективности.

Комментарии: 2

fr.butch - 17.02.2014

if not statsdict.haskey('test'):
первый раз вижу чтобы реально кто то использовал haskey вместо key in dict. haskey кстати выкинули из 3.х. но это кажется не аргумент.


сам недавно думал как организовать тысячи паралельных http head запросов, остановился в итоге на асинхронном tornado httpclient.
svetlyak40wt - 17.02.2014 Redis в конечном счете, более универсален. Что если ты со временем будешь запускать свои процессы на разных машинах? Тут уже dict из multiprocessing не подойдет никак.

Добавить комментарий:


Буду использовать, только для связи с тобой

Чтобы и другие могли узнать о тебе

Вы можете использовать markdown разметку.

Например:
**жирный**
*курсив*
## Заголовок

Не используйте html-тэги. Все ссылки станут активными, все переводы строк будут заменены на <br>
captcha