大多数基于 win32serviceutil.ServiceFramework 的python windows服务示例都使用 win32event 进行同步。
例如:
有人可以清楚地解释为什么win32events是必要的(上例中的self.stop_event)?
由于调用svcStop和svcRun的不同线程,我认为有必要使用win32event吗?但是我感到困惑,还有很多其他的事情发生了:python.exe和pythonservice.exe之间的区别,系统与本地线程(?),python GIL ......
答案 0 :(得分: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.
系统线程与本地线程到底是什么意思?你的意思是直接从GIL之外的C创建的线程?
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外部中断解释器,即使python是在主线程的阻塞调用中,例如:time.sleep(10)
你可以从中断之外的那些点中断GIL,避免服务不响。
大多数win32服务调用都在python c宏之间:
Py_BEGIN_ALLOW_THREADS / Py_END_ALLOW_THREADS
答案 1 :(得分:0)
可能是,作为示例,他们在SvcDoRun中没有任何其他有趣的事情。 SvcStop将从另一个线程调用,因此使用事件只是一种简单的方法来进行跨线程通信,以便在适当的时候退出SvcDoRun。
如果在SvcDoRun中存在阻止的某些类似服务的功能,则他们不一定需要这些事件。考虑您链接到的CherryPy页面中的第二个示例。它以阻塞模式启动Web服务器,因此无需等待事件。