2012-04-12 2 views
1

ich verwende Python 2.6, 217 und Windows pywin32 zu bauen 7.Python, pywin32, Windows Service und Multiprocessing

ich ein Windows-Dienste wie folgt erstellt:

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 

Mein Problem, dass die Multiprocessing ist Instanzen feuern nie. Gibt es eine Möglichkeit, das Multiprocessing-Modul zum Laufen zu bringen? Ich könnte Subprocessing verwenden, aber ich möchte wirklich nicht zwei Python-Dateien pflegen müssen.

Dank

+0

durch die Art und Weise finden Sie die gesamte Verarbeitung in anderen Modul tun sollte, es ist ein litle chaotisch;) – sacabuche

Antwort

1

In der Tat Python ein bug auf dem ..multiprocessing/forking.py Modul hat der Grund, ist dies:

Wenn das Programm als Windows-Dienst ausgeführt wird, ist aber nicht in eine einzige ausführbare Datei verpackt, main_path wird der Pfad zur -Servicedatei (in der Regel pythonservice.exe). Wenn diese Daten es in den untergeordneten Prozess übergibt, behandelt die prepare() - Funktion main_path als Pfad zu einem Python-Modul und versucht, es zu importieren. Dies führt zum Fehlschlagen.

Sie den Patch here
oder laden Sie die gesamte Datei von here