Python、pywin32、Windows服务和多处理

2024-10-03 17:16:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是python2.6、pywin32build217和windows7。在

我创建了一个windows服务,如下所示:

class Service(win32serviceutil.ServiceFramework):

    _svc_name_ = 'MPTESTER'
    _svc_display_name_ = 'MP TESTER'
    _svc_description_ = "NA"
    _scratch_workspace_ = os.environ["TEMP"]
    _process_count_ = (int(os.environ["NUMBER_OF_PROCESSORS"]) *2) -1
    _pool_ = None
    def __init__(self, *args):
        win32serviceutil.ServiceFramework.__init__(self, *args)
        self.log('init')
        self.runFlag = True
        self.stop_event = win32event.CreateEvent(None, 0, 0, None)
    def log(self, msg):
        import servicemanager
        servicemanager.LogInfoMsg(str(msg))
    def sleep(self, sec):
        win32api.Sleep(sec*1000, True)
    def SvcDoRun(self):
        self.ReportServiceStatus(win32service.SERVICE_START_PENDING)
        try:
            self.ReportServiceStatus(win32service.SERVICE_RUNNING)
            self.log('start')
            self.start()
            while self.runflag == True:
                pass
            self.log('wait')
            win32event.WaitForSingleObject(self.stop_event, win32event.INFINITE)
            self.log('done')
        except Exception, x:
            self.log('Exception : %s' % x)
            self.SvcStop()
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        self.log('stopping')
        self.stop()
        self.log('stopped')
        win32event.SetEvent(self.stop_event)
        self.ReportServiceStatus(win32service.SERVICE_STOPPED)
    def start(self):
        dummyFilePath = r"c:\temp\errorLog.log"
        with open(dummyFilePath,'w') as dummy:
            #pythonFile = os.path.basename(str(inspect.getfile(inspect.currentframe())))
            #scriptPath = str(inspect.getfile(inspect.currentframe())).replace(os.sep + pythonFile,"")
            dummy.write('test 1\n')
            dummy.flush()
            pythonExe = os.path.join(sys.exec_prefix, 'python.exe')
            multiprocessing.set_executable(pythonExe)
            dummy.write('test 2\n')
            dummy.flush()
            if self.runFlag == None:
                self.runFlag = True
            dummy.write('test 3\n')
            dummy.flush()
            while self.runFlag:
                dummy.write('test 4\n')
                dummy.flush()
                results = []
                pool = multiprocessing.Pool((int(os.environ["NUMBER_OF_PROCESSORS"]) *2) -1)
                dummy.write("After POOL CREATED")
                dummy.flush()
                for i in range(self._process_count_):
                    dummy.write('test in range \n')
                    dummy.flush()
                    results.append(pool.apply_async(someLongFunction, 
                                                   [r"c:\temp",
                                                    "test_" + str(i) + ".txt"
                                                         ] ))

                #    Wait for all processes to finish
                #
                pool.close()
                pool.join()
                dummy.write("WAITING TO FINISH!")
                dummy.flush()
                #    delete the references
                #
                del results
                del pool
                dummy.write('fin test \n')
                dummy.flush()
                self.stop()
                break
    def stop(self): 
        self.runFlag = False

我的问题是多处理实例从不触发。有没有办法让多处理模块工作?我可以使用子处理,但我真的不想维护两个python文件。在

谢谢


Tags: testselfnonelogtrueosdefservice
1条回答
网友
1楼 · 发布于 2024-10-03 17:16:24

实际上,python在..multiprocessing/forking.py模块上有一个bug,原因是:

When the program is running as a Windows service, but is not packaged into a single executable, main_path will become the path to the service executable (typically, pythonservice.exe). When this data makes it to the child process, the prepare() function will treat main_path as a path to a python module, and will try to import it. This causes it to fail.

您可以找到补丁here
或者从here下载整个文件

相关问题 更多 >