[Python] Расшарить один бит между процессами?
От: Аноним  
Дата: 26.01.10 10:32
Оценка: 1 (1) -1
Как наиболее просто расшарить один бит между разными процессами? При этом ни один процесс не является предком/дочерним от другого.
Версия питона 2.4, использовать сторонние пакаджи не желательно. В сях бы я использовал посиксные функции sem_xxx. А в питоне что-то подобное есть?
На крайняк можно конечно этот бит в файл сохранять, но хотелось бы по проще.
python sem_open multiprocessing
Re: [Python] Расшарить один бит между процессами?
От: Аноним  
Дата: 26.01.10 11:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>В сях бы я использовал посиксные функции sem_xxx. А в питоне что-то подобное есть?

Угу уже минусы пошли, не понятно за что Пока нашел библиотеку posix_ipc, пытаюсь узнать можем ли мы ее использовать в нашем коде.
Re: [Python] Расшарить один бит между процессами?
От: dotidot Россия  
Дата: 26.01.10 12:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>На крайняк можно конечно этот бит в файл сохранять, но хотелось бы по проще.

озвучте оригинальную задачу, а не конкретное решение. нужна синхронизация обработки? или что?
Re[2]: [Python] Расшарить один бит между процессами?
От: neFormal Россия  
Дата: 26.01.10 12:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Угу уже минусы пошли, не понятно за что


я переведу
он минусом так обычно намекает, что задача и/или вариант реализации по его мнению ущербны..
...coding for chaos...
Re[2]: [Python] Расшарить один бит между процессами?
От: Аноним  
Дата: 26.01.10 20:20
Оценка:
Здравствуйте, dotidot, Вы писали:

D>озвучте оригинальную задачу, а не конкретное решение. нужна синхронизация обработки? или что?

Полностью задача выглядит так: есть сервис и у него есть db (грубо говоря кеш). Также есть другой скрипт который запускается по крону и должен обновить базу. Поскольку база SQLite, то она не может одновременно писать и читать, а уж очень хочется. Соответственно делаем две базы -- первая активная, которая используется для обработки запросов пользователя и вторая которая используется скриптом обновления. Как только обновление завершается и все в порядке, то базы меняются местами. Вот этот бит и нужен, для того чтобы сказать какая из баз сейчас активная, а какая для обновления. Идеи использовать нормальную базу или не использовать двойную базу не предлагать. Эта схема используется и по нескольким другим причинам, которые здесь 100% офтоп.
То есть нужна не синхронизация, а просто шарить один бит. Атомарность как бы не нужна, но шарить один бит через файл не хочется.
Re[3]: [Python] Расшарить один бит между процессами?
От: dotidot Россия  
Дата: 26.01.10 23:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А> которые здесь 100% офтоп.

это единственное что я понял из описания. могу сделать предложение не парится и сделать хоть как нибудь (как удобнее и быстрее сделать).
ИМХО это будет решением соответствующие духу проекта!
Успехов!
Re[3]: [Python] Расшарить один бит между процессами?
От: novitk США  
Дата: 26.01.10 23:11
Оценка:
Здравствуйте, Аноним, Вы писали:

здесь, но я бы использовал файл для надежности.
Re[3]: [Python] Расшарить один бит между процессами?
От: ygrechuk  
Дата: 27.01.10 14:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Поскольку база SQLite, то она не может одновременно писать и читать, а уж очень хочется.


Вроде может: http://www2.sqlite.org/lockingv3.html
Re[4]: [Python] Расшарить один бит между процессами?
От: Аноним  
Дата: 27.01.10 15:09
Оценка:
Здравствуйте, novitk, Вы писали:

N>здесь, но я бы использовал файл для надежности.

В данной задаче использование меморимап излишество. Проверка этого бита будет не так уж часто делаться, причем всё равно после этой проверки будет открываться база и что-то с ней делаться. То есть на фоне задачи эта проверка будет теряться. Единственно что меня беспокоит, когда один процесс будет менять содержимое файла, может ли быть момент когда файл будет "не хорошем" состоянии. То есть например иметь нулевую длину. Хотя в любом случае, в этот момент, когда обновление файла не завершилось полностью, можно использовать любую базу из двух -- ну подумаешь обработка запроса будет сделана на базе которая устарела на доли секунды. В моей задаче это не критично.
Судя по всему так и сделаю, раз без установки "левых" либ, нельзя добраться до системных семафоров
Re[3]: [Python] Расшарить один бит между процессами?
От: Neco  
Дата: 28.01.10 04:51
Оценка:
Здравствуйте, Аноним, Вы писали:

D>>озвучте оригинальную задачу, а не конкретное решение. нужна синхронизация обработки? или что?

А>Полностью задача выглядит так: есть сервис и у него есть db (грубо говоря кеш). Также есть другой скрипт который запускается по крону и должен обновить базу.
а нельзя сделать так, чтобы сервис сам обновлял базу, а скрипт запускающийся по крону стучал сервису, что мол надо начинать обновление? стучать можно по-разному — через сокеты, например (не знаю, какие у вас возможности). если в сервис скриптовую логику запихнуть сложно, пусть один скрипт запускается по крону, стучит сервису, а сервис запускает другой скрипт.

кроме того, можно вообще не шарить этот бит, а расположить его в памяти сервиса. Скрипт, запускаясь, по протоколу сервиса отсылает ему команду поменять значение этого бита и (если команда прошла успешно) делает обновление, меняет базу местами и т.д., думаю, идея ясна.
всю ночь не ем, весь день не сплю — устаю
Re[5]: [Python] Расшарить один бит между процессами?
От: FR  
Дата: 28.01.10 08:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Судя по всему так и сделаю, раз без установки "левых" либ, нельзя добраться до системных семафоров


Можно ctypes (который с python 2.5 в стандартной поставке) в зубы и вперед.
Re[5]: [Python] Расшарить один бит между процессами?
От: quodum  
Дата: 28.01.10 13:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, novitk, Вы писали:


А> Единственно что меня беспокоит, когда один процесс будет менять содержимое файла, может ли быть момент когда файл будет "не хорошем" состоянии. То есть например иметь нулевую длину.


А это можно обойти, используя файл-флаг: файл произвольного содержимого (напр. пустой), имя (или само наличие) которого несёт необходимую информацию. Для переключения состояния -- этот файл переименовывать. Переименование атомарно.
Re: [Python] Расшарить один бит между процессами?
От: c-smile Канада http://terrainformatica.com
Дата: 28.01.10 17:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как наиболее просто расшарить один бит между разными процессами? При этом ни один процесс не является предком/дочерним от другого.

А>Версия питона 2.4, использовать сторонние пакаджи не желательно. В сях бы я использовал посиксные функции sem_xxx. А в питоне что-то подобное есть?
А>На крайняк можно конечно этот бит в файл сохранять, но хотелось бы по проще.

Такой "бит" называется mutex:
http://code.activestate.com/recipes/474070/
Re[2]: [Python] Расшарить один бит между процессами?
От: Аноним  
Дата: 29.01.10 11:32
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Такой "бит" называется mutex:

CS>http://code.activestate.com/recipes/474070/
К сожалению, у меня не совсем винда, вернее я бы сказал совсем не винда. И модуля win32event нету Аналогичного встроего модуля для Linux я не нашел
Re[6]: [Python] Расшарить один бит между процессами?
От: Аноним  
Дата: 29.01.10 11:38
Оценка:
Здравствуйте, FR, Вы писали:

FR>Можно ctypes (который с python 2.5 в стандартной поставке) в зубы и вперед.

Ага, спасибо, очень полезная библиотека , только судя по всему ее тоже не получится использовать, поскольку её нету в стандартной поставке питона 2.4 . В общем остановился я на файлах, пишу доку, посмотрим что архитекторы скажут.
Re[3]: [Python] Расшарить один бит между процессами?
От: Аноним  
Дата: 06.02.10 06:02
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, dotidot, Вы писали:


D>>озвучте оригинальную задачу, а не конкретное решение. нужна синхронизация обработки? или что?

А>Полностью задача выглядит так: есть сервис и у него есть db (грубо говоря кеш). Также есть другой скрипт который запускается по крону и должен обновить базу. Поскольку база SQLite, то она не может одновременно писать и читать, а уж очень хочется. Соответственно делаем две базы -- первая активная, которая используется для обработки запросов пользователя и вторая которая используется скриптом обновления. Как только обновление завершается и все в порядке, то базы меняются местами. Вот этот бит и нужен, для того чтобы сказать какая из баз сейчас активная, а какая для обновления. Идеи использовать нормальную базу или не использовать двойную базу не предлагать. Эта схема используется и по нескольким другим причинам, которые здесь 100% офтоп.
А>То есть нужна не синхронизация, а просто шарить один бит. Атомарность как бы не нужна, но шарить один бит через файл не хочется.

Почему бы не использовать сам факт наличия второй базы в качестве этого самого бита? Создаем базы вида db_{xxxxx}.db где xxxxx целое число, в начале работы сервиса запоминаем это число и время от времени проверяем наличие базы с именем xxxxx+1, при наличии переключаемся на него. Скрипт обновления обновляет временный файл или базу db_{xxxxx-1}.db, переименовывает его в db_{xxxxx+1}.db и удаляет db_{xxxxx-1}.db который уже не должен использоваться по логике.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.