解释python windows服务示例(win32serviceutil.serviceframework)

时间:2014-11-21 13:11:11

标签: python multithreading windows-services pywin32

大多数基于 win32serviceutil.ServiceFramework 的python windows服务示例都使用 win32event 进行同步。

例如:

有人可以清楚地解释为什么win32events是必要的(上例中的self.stop_event)?

由于调用svcStop和svcRun的不同线程,我认为有必要使用win32event吗?但是我感到困惑,还有很多其他的事情发生了:python.exe和pythonservice.exe之间的区别,系统与本地线程(?),python GIL ......

2 个答案:

答案 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服务器,因此无需等待事件。