* [devel] Q: AptPkg.pm и два репозитария @ 2011-01-21 12:44 Paul Wolneykien 2011-01-21 12:50 ` Alexey I. Froloff 2011-01-21 13:55 ` Sergei Epiphanov 0 siblings, 2 replies; 5+ messages in thread From: Paul Wolneykien @ 2011-01-21 12:44 UTC (permalink / raw) To: ALT Linux Team development discussions Здравствуйте, все. Есть такой перловый модуль AptPkg.pm, который является обёрткой над libapt-pkg. И он даже вполне пристойно работает, за исключением одной маленькой детали: большинство объектов работают с глобальной переменной $_config которая определяет рабочую конфигурацию APT (apt.conf). И получается, что я не могу иметь два набора объектов, настроенных на работу для двух разных репозитариев. Единственный вариант, до которого я додумался — это изоляция на уровне процессов, но для решаемой задачи такой вариант очень неудобен: хочется делать запросы к разным репозитариями в рамках единого процесса, а не через именованные каналы. Вопрос к специалистам по Perl: можно ли каким-нибудь элегантным образом всё-таки создать в данном случае два независимых набора объектов? Например, каким-то образом дважды загрузить один и тот же модуль, но проинициализировать каждый экземпляр по разному? Павел. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [devel] Q: AptPkg.pm и два репозитария 2011-01-21 12:44 [devel] Q: AptPkg.pm и два репозитария Paul Wolneykien @ 2011-01-21 12:50 ` Alexey I. Froloff 2011-01-21 13:55 ` Sergei Epiphanov 1 sibling, 0 replies; 5+ messages in thread From: Alexey I. Froloff @ 2011-01-21 12:50 UTC (permalink / raw) To: ALT Devel discussion list [-- Attachment #1: Type: text/plain, Size: 582 bytes --] On Fri, Jan 21, 2011 at 03:44:11PM +0300, Paul Wolneykien wrote: > Есть такой перловый модуль AptPkg.pm, который является обёрткой над > libapt-pkg. И он даже вполне пристойно работает, за исключением одной > маленькой детали: большинство объектов работают с глобальной переменной > $_config которая определяет рабочую конфигурацию APT (apt.conf). И > получается, что я не могу иметь два набора объектов, настроенных на > работу для двух разных репозитариев. Так работает libapt-pkg. Страдай. -- Regards, -- Sir Raorn. --- http://thousandsofhate.blogspot.com/ [-- Attachment #2: Digital signature --] [-- Type: application/pgp-signature, Size: 836 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [devel] Q: AptPkg.pm и два репозитария 2011-01-21 12:44 [devel] Q: AptPkg.pm и два репозитария Paul Wolneykien 2011-01-21 12:50 ` Alexey I. Froloff @ 2011-01-21 13:55 ` Sergei Epiphanov 2011-01-21 14:33 ` Paul Wolneykien 1 sibling, 1 reply; 5+ messages in thread From: Sergei Epiphanov @ 2011-01-21 13:55 UTC (permalink / raw) To: ALT Linux Team development discussions [-- Attachment #1: Type: Text/Plain, Size: 720 bytes --] В сообщении от 21 января 2011 15:44:11 автор Paul Wolneykien написал: > Вопрос к специалистам по Perl: можно ли каким-нибудь элегантным > образом всё-таки создать в данном случае два независимых набора > объектов? Например, каким-то образом дважды загрузить один и тот же > модуль, но проинициализировать каждый экземпляр по разному? Через local попробуйте. Тестовый пример в аттаче. -- С уважением, Епифанов Сергей [-- Attachment #2: test.tar.bz2 --] [-- Type: application/x-bzip-compressed-tar, Size: 448 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [devel] Q: AptPkg.pm и два репозитария 2011-01-21 13:55 ` Sergei Epiphanov @ 2011-01-21 14:33 ` Paul Wolneykien 2011-01-21 15:16 ` Sergei Epiphanov 0 siblings, 1 reply; 5+ messages in thread From: Paul Wolneykien @ 2011-01-21 14:33 UTC (permalink / raw) To: devel 21.01.2011 16:55, Sergei Epiphanov пишет: > В сообщении от 21 января 2011 15:44:11 автор Paul Wolneykien написал: >> Вопрос к специалистам по Perl: можно ли каким-нибудь элегантным >> образом всё-таки создать в данном случае два независимых набора >> объектов? Например, каким-то образом дважды загрузить один и тот же >> модуль, но проинициализировать каждый экземпляр по разному? > > Через local попробуйте. Тестовый пример в аттаче. Большое спасибо, Сергей. Я сейчас пытаюсь сделать и так и этак, посмотрим, что получится. Однако пока я не уверен в том, что переназначение глобальной переменной это хорошая идея: 1. я точно не знаю, как правильно создать новый экземпляр конфигурации и как правильно его проинициализировать; и по идее не должен этого знать, т.к. это внутренние «потроха» модуля; в документации написано, что если просто загрузить модуль через use, то $_config будет проинициализирована автоматически; хотелось бы использовать этот механизм автонастройки для каждого экземпляра модуля; 2. что будет в многопоточной программе? я же не знаю, кто ещё использует этот самый $Module::_config ? паранойя, кончено, т.к. у меня нет параллельных сегментов программы, но хотелось бы иметь решение, которое давало бы надёжную изоляцию. Павел. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [devel] Q: AptPkg.pm и два репозитария 2011-01-21 14:33 ` Paul Wolneykien @ 2011-01-21 15:16 ` Sergei Epiphanov 0 siblings, 0 replies; 5+ messages in thread From: Sergei Epiphanov @ 2011-01-21 15:16 UTC (permalink / raw) To: ALT Linux Team development discussions В сообщении от 21 января 2011 17:33:03 автор Paul Wolneykien написал: > Большое спасибо, Сергей. Я сейчас пытаюсь сделать и так и этак, > посмотрим, что получится. Однако пока я не уверен в том, что > переназначение глобальной переменной это хорошая идея: При помощи local переменная лишь временно подменяется (на момент выполнения функции). > 1. я точно не знаю, как правильно создать новый экземпляр конфигурации > и как правильно его проинициализировать; и по идее не должен этого > знать, т.к. это внутренние «потроха» модуля; в документации написано, > что если просто загрузить модуль через use, то $_config будет > проинициализирована автоматически; хотелось бы использовать этот > механизм автонастройки для каждого экземпляра модуля; А что мешает при инициализации своего модуля скопировать (deep copy) текущее значение $_config (которое к этому времени уже будет проинициализировано)? > 2. что будет в многопоточной программе? я же не знаю, кто ещё > использует этот самый $Module::_config ? паранойя, кончено, т.к. у меня > нет параллельных сегментов программы, но хотелось бы иметь решение, > которое давало бы надёжную изоляцию. Вот здесь уже сложнее, надо изучать. Но другие подмены мне неизвестны, так как все описания хранятся в общем хеше (равно как и описание модуля). И для временных подмен значений разработчики перла советуют именно local. Тем более, что local - это лексическая подмена, то есть на момент выполнения этого куска программы. Можно в допмодуле организовать семафоры или мьютексы, тем самым не допуская параллельных вызовов основного модуля. Оптимальное решение, но трудоёмкое: самому переписать модуль так, чтобы он не имел ссылок на глобальные переменные (создав контекст вызова). В своё время я на своей работе при написании интерфейсного модуля на перл уходил от глобальных переменных, но там пришлось переписать ещё библиотеки, которые тупо лезли в глобальные переменные, благо были исходники. А проверить ссылки на $Module::_config достаточно внутри самого модуля: маловероятно, что кто-то ещё будет ковырять внутренности. Можно как-то так: package Module; $_config="0"; sub printc(){ print "config=$_config"; return; } 1; package Module1; use Module; sub AUTOLOAD{ { #lock mutex here local $Module::_config = $_[0]; my $program = $AUTOLOAD; $program =~ s/.*:://; @l = &{"Module::$program"}(@_[1..$#_]); $_[0] = $Module::_config; #release mutex here } return @l; } 1; package MAIN; use Module1; $cnf="2"; Module1::printc($cnf); С этим уже можно пробовать делать неограниченное количество контекстов. -- С уважением, Епифанов Сергей ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2011-01-21 15:16 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2011-01-21 12:44 [devel] Q: AptPkg.pm и два репозитария Paul Wolneykien 2011-01-21 12:50 ` Alexey I. Froloff 2011-01-21 13:55 ` Sergei Epiphanov 2011-01-21 14:33 ` Paul Wolneykien 2011-01-21 15:16 ` Sergei Epiphanov
ALT Linux Team development discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://lore.altlinux.org/devel/0 devel/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 devel devel/ http://lore.altlinux.org/devel \ devel@altlinux.org devel@altlinux.ru devel@lists.altlinux.org devel@lists.altlinux.ru devel@linux.iplabs.ru mandrake-russian@linuxteam.iplabs.ru sisyphus@linuxteam.iplabs.ru public-inbox-index devel Example config snippet for mirrors. Newsgroup available over NNTP: nntp://lore.altlinux.org/org.altlinux.lists.devel AGPL code for this site: git clone https://public-inbox.org/public-inbox.git