2012-04-12 3 views
1

Я использую Python 2.6, pywin32 построить 217 и Windows, 7.Python, pywin32, Windows Service и многопроцессорных

Я создал окна следующие услуги:

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

ответ

1

На самом деле питон имеет bug на ..multiprocessing/forking.py модуле причина заключается в следующем:

Когда программа работает как служба Windows, но не упакован в один исполняемый файл, main_path станет путем выполнения служебного файла (обычно, pythonservice.exe). Когда эти данные переходят к дочернему процессу, функция prepare() будет обрабатывать main_path как путь к модулю python и будет пытаться импортировать его. Это приводит к сбою.

вы можете найти патч here
или загрузить весь файл из here