maysam_p82 Ответов: 0

Python win32 service and threading problem


Всем привет . Я собираюсь написать службу windows на python 27. Существует встроенная функция, которая мозаично рисует плитки с именем arcpy.mosaicmanagement() . Я хочу дать функцию потоку работать одновременно. У меня есть две проблемы:
1 - я мог бы запустить программу как службу в Windows, и все работает довольно хорошо, и я вижу службу в службах, но служба win32 останавливается после запуска один раз.
2 - Как я могу заставить метод работать одновременно с несколькими потоками
вот код, который я попробовал.

Что я уже пробовал:

import os,fnmatch     
import glob
import arcpy
import win32serviceutil
import win32service
import win32event
import servicemanager
import socket
import logging
import os.path
from arcpy import env
from arcpy.sa import *
logging.basicConfig(
    filename = 'e:\\Temp\\PictureService.log',
    level = logging.DEBUG, 
    format = '[PictureGenerator-service] %(levelname)-7.7s %(message)s'
)
class PictureGeneratorSvc (win32serviceutil.ServiceFramework):
    _svc_name_ = "PictureGenerator-Service"
    _svc_display_name_ = "PictureGenerator Service"
    
    def __init__(self,args):
        win32serviceutil.ServiceFramework.__init__(self,args)
        self.stop_event = win32event.CreateEvent(None,0,0,None)
        #socket.setdefaulttimeout(420)
        self.stop_requested = False
    def SvcStop(self):
        self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
        win32event.SetEvent(self.stop_event)
        logging.info('Stopping service ...')
        self.stop_requested = True
    def SvcDoRun(self):
        servicemanager.LogMsg(
            servicemanager.EVENTLOG_INFORMATION_TYPE,
            servicemanager.PYS_SERVICE_STARTED,
            (self._svc_name_,'')
        )
        self.main()
    def main(self):
        arrFiles = []
        #i=0
        strPath = 'E:\\Zargari\\FRECRaster Dataset\\DrG-GoogleDownload - Copy\\MyTests\\ReadyToImport\\'
        logging.info(' ** Picture Generator ** ')
        # Simulate a main loop
        if self.stop_requested:
                   logging.info('A stop signal was received: Breaking main loop ...')
                  
        #time.sleep(60)
        logging.info("Service Started at %s" % time.ctime())
        if not os.listdir(strPath) : 
         for root, dirs, filenames in os.walk(strPath):
               for file in filenames:
                   if file.endswith(('.tif')):
                      arrFiles.append(file)
         try:
             #while i<len(arrFiles):
              for i in range(len(arrFiles)):
                  thread = threading.Thread(target=arcpy.Mosaic_management,args=(strPath + arrFiles[i], "E:\Zargari\FRECRaster Dataset\MyTests\MyTests\Z.gdb\\FREC", "LAST", "FIRST", "", "", "NONE", "0", "NONE"))
                  thread.setDaemon(true)
                  thread_list.append(thread)
                  thread.start()
                       #arcpy.Mosaic_management(inputs=strPath + arrFiles[i], target="E:\Zargari\FRECRaster Dataset\DrG-GoogleDownload - Copy\MyTests\Z.gdb\\FREC", mosaic_type="LAST", colormap="FIRST", background_value="", nodata_value="", onebit_to_eightbit="NONE", mosaicking_tolerance="0", MatchingMethod="NONE")
                 #i+=1
                  logging.info("Exception occurred %s" % arrFiles[i] % time.ctime())
              time.sleep(60)              
         except exception as e:
                  logging.info("Exception occurred %s" % e % time.ctime())
         return   
if __name__ == '__main__':
    if len(sys.argv) == 1:
     servicemanager.Initialize()
     servicemanager.PrepareToHostSingle(PictureGeneratorSvc)
     servicemanager.StartServiceCtrlDispatcher()
else:
    win32serviceutil.HandleCommandLine(PictureGeneratorSvc) 

0 Ответов