1

我正在使用 python 2.6、pywin32 build 217 和 Windows 7。

我创建了一个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 文件。

谢谢

4

1 回答 1

1

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

当程序作为 Windows 服务运行但未打包到单个可执行文件中时,main_path 将成为服务可执行文件(通常为 pythonservice.exe)的路径。当此数据进入子进程时,prepare() 函数会将 main_path 视为 Python 模块的路径,并尝试导入它。这会导致它失败。

你可以在这里找到补丁或者从这里
下载整个文件

于 2012-04-26T18:56:19.630 回答