2012-04-12 62 views
1

我使用python 2.6,pywin32建立217和Windows 7Python和pywin32,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文件。

感謝

+0

整個文件,這是一個利特爾混亂不堪;) – sacabuche 2012-04-26 19:05:53

回答

1

其實蟒蛇有..multiprocessing/forking.py模塊上的bug原因是這樣的:

當程序運行作爲Windows服務,而不是打包 成一個單一的可執行文件, main_path將成爲 服務可執行文件(通常爲pythonservice.exe)的路徑。當這個數據 使它進入子進程時,prepare()函數將把 main_path當作python模塊的路徑,並且會嘗試導入它。 這會導致它失敗。

你可以找到補丁here
或者你應該做的所有的處理在其他模塊的方式下載從here