Форум сайта python.su
В описании Python-UNO bridge (http://udk.openoffice.org/python/python-bridge.html) в конце первого примера HelloWorld есть загадочный комментарий, смысл которого для меня не понятен:
# Do a nasty thing before exiting the python process. In case the
# last call is a oneway call (e.g. see idl-spec of insertString),
# it must be forced out of the remote-bridge caches before python
# exits the process. Otherwise, the oneway call may or may not reach
# the target object.
# I do this here by calling a cheap synchronous call (getPropertyValue).
ctx.ServiceManager
Перед выходом из питона делаем рискованную вещь. В случае, если последний вызов является односторонним (т.е. см. idl-spec of insertString), его нужно вытеснить из remote-bridge кэша перед тем, как питон завершит процесс. Иначе достижение целевого объекта односторонним вызовом не гарантировано.Пожалуй, “и хрюкатали зелюки как мумзики в мове” для меня будет понятнее, чем этот текст. Текст непонятен настолько, что я даже не знаю, что спросить :). Что такое idl-spec, insertString, remote-bridge кэш, “целевой объект”, “односторонний вызов”, “легкий синхронный вызов”?
В приведенном примере я делаю это посредством легкого синхронного вызова (getPropertyValue).
Офлайн
idl
В комментах предупреждают, что надо данные из кэша синхронизировать перед выходом из проги.
Офлайн
Не понятно, что делает вызов “ctx.ServiceManager”, что за кэш и с чем синхронизируются его данные.
Офлайн
Насколько я понимаю(а изучал я это целых 10 минут :) ) при работе с удаленным объектом(UNO - Universal Network Objects), кода ты вызываешь методы изменяющие этот самый объект, изменения применяются не сразу и сначала заносятся в кэш. И если не синхронизировать кэш с этим самым объектом, то изменения будут потеряны.
P.S. Вообще, как я понял, UNO напоминает CORBA?
Офлайн
slivlen, спасибо, это уже что-то.
Я так понял, что изменения не то чтобы “будут потеряны”, но их применение просто “не гарантировано”.
Ещё понять бы, почему “последний вызов” (насколько я понял, метода insertString) обозван “односторонним”.
Офлайн
И кстати, какая связь между “ctx.ServiceManager” и “легким синхронным вызовом (getPropertyValue)”?
Офлайн
Все ники занятыOneway call - это метод, который ничего не возвращает и во время выполнения которого не возникают специфические(пользовательские) исключения. Клиент вызывает oneway call метод, затем как только запрос на выполнение этого метода достигает(но не обязательно, сразу начинает выполнятся) удаленного объекта, клиент не дожидаясь результата продолжает выполнение программы. Фактически oneway call методы являются не блокирующими.
Ещё понять бы, почему “последний вызов” (насколько я понял, метода insertString) обозван “односторонним”.
Офлайн
Все ники занятыХЗ. Это уже апи надо копать и разбираться :)
И кстати, какая связь между “ctx.ServiceManager” и “легким синхронным вызовом (getPropertyValue)”?
Офлайн
slivlen, спасибо. Значит, “Oneway call” - это что-то вроде асинхронного вызова.
Единственно, что не совсем понятно, почему написано "In case the last call is a oneway call“. Т.е. вызов ”text.insertString", о котором вроде и идёт речь, может быть как синхронным, так и асинхронным, что ли?
Офлайн
Все ники занятыНет. Здесь имеется ввиду что последним был любой oneway call(insertString просто приведен для примера). Похоже, что при выполнении обычных методов, происходит также обработка запросов из кэша, поэтому, в случае, когда обычный метод вызывался последним синхронизация не требуется.
Единственно, что не совсем понятно, почему написано “In case the last call is a oneway call”. Т.е. вызов “text.insertString”, о котором вроде и идёт речь, может быть как синхронным, так и асинхронным, что ли?
Офлайн