2012-04-12 11 views
1
私は次のように私は、Windowsサービスを作成した217およびWindows 7

パイソン、pywin32、Windowsサービス、およびマルチプロセッシング

を構築pywin32はPython 2.6を使用しています

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 

私の問題は、マルチプロセッシングということですインスタンスは決して起動しません。マルチプロセッシングモジュールを動作させる方法はありますか?私はサブプロセスを使うことができましたが、私は本当に2つのpythonファイルを維持する必要はありません。 Pythonは理由がこれです..multiprocessing/forking.pyモジュールのbugを持って実際に

おかげ

+0

からファイル全体をダウンロードすることができ、それは厄介litleです;) – sacabuche

答えて

1

プログラムは、Windowsサービスとして実行されているが、単一の実行可能ファイルに パッケージされていません、 main_pathは、サービス実行ファイル (通常はpythonservice.exe)へのパスになります。このデータ が子プロセスにすると、prepare()関数は main_pathをPythonモジュールのパスとして扱い、それをインポートしようとします。 これは失敗します。

パッチhere
を見つけたり、他のモジュール内のすべての処理を行うべき方法でhere

関連する問題