2014-11-21 4 views
1

Большинство примеров питона окна обслуживания на основе win32serviceutil.ServiceFramework использовать win32event для синхронизации.объяснить пример питона окна службы (win32serviceutil.serviceframework)

Например:

  • http://tools.cherrypy.org/wiki/WindowsService (пример для CherryPy 3.0)
  • (жаль, что я не имею репутацию размещать больше ссылок, но много подобных примеров можно гугле)

Может ли кто-нибудь четко объяснить, почему нужны win32events (self.stop_event в приведенном выше примере)?

Думаю, его необходимо использовать win32event из-за разных потоков, вызывающих svcStop и svcRun? Но я путаться, есть так много других вещей, случающихся: (?) Раскол между python.exe и pythonservice.exe, системой против локальных потоков, питон GIL ..

ответ

0

Для верхней части PythonService.cpp

PURPOSE: An executable that hosts Python services. 
     This source file is used to compile 2 discrete targets: 
      * servicemanager.pyd - A Python extension that contains 
      all the functionality. 
      * PythonService.exe - This simply loads servicemanager.pyd, and 
      calls a public function. Note that PythonService.exe may one 
      day die - it is now possible for python.exe to directly host 
      services. 

Что именно вы подразумеваете под системными потоками и локальными потоками? Вы имеете в виду потоки, созданные непосредственно с C за пределами GIL?

PythonService.cpp только что связал имена вызываемых объектов python и кучу свойств, как и принятые методы.

, например, принятые управления от ServiceFramework:

def GetAcceptedControls(self): 
    # Setup the service controls we accept based on our attributes. Note 
    # that if you need to handle controls via SvcOther[Ex](), you must 
    # override this. 
    accepted = 0 
    if hasattr(self, "SvcStop"): accepted = accepted | win32service.SERVICE_ACCEPT_STOP 
    if hasattr(self, "SvcPause") and hasattr(self, "SvcContinue"): 
     accepted = accepted | win32service.SERVICE_ACCEPT_PAUSE_CONTINUE 
    if hasattr(self, "SvcShutdown"): accepted = accepted | win32service.SERVICE_ACCEPT_SHUTDOWN 
    return accepted 

Я предполагаю, что события рекомендуются, потому что, как вы могли бы прервать переводчик из-за GIL, даже если питон находится в блокирующем вызове от основной поток, например: time.sleep(10), вы можете прервать эти пункты за пределами GIL и избежать необходимости отвечать на запросы.

Большинство вызовов win32 услуг в между питон гр макросов:

Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS

0

Это может быть, что, будучи примеры, они не имеют ничего иного интересного сделать в SvcDoRun. SvcStop будет вызываться из другого потока, поэтому использование события - это просто простой способ для обмена данными между потоками, чтобы вывести SvcDoRun в соответствующее время.

Если были какие-то служебные функции , которые блокируют в SvcDoRun, им не обязательно нужны события. Рассмотрим второй пример на странице CherryPy, с которой вы связались. Он запускает веб-сервер в режиме блокировки, поэтому нет необходимости ждать события.