我正在使用 python 2.6、pywin32 build 217 和 Windows 7。
我创建了一个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 文件。
谢谢