Для верхней части 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