Я пишу службу Windows с мультипроверкой, и у меня возникают проблемы с методом, который вызывается в пуле.Код пула Python не работает
Сейчас я могу установить службу и запустить ее, она выводит The service started running...
в файл журнала, но ничего больше.
Посмотрите на проводник процесса (см. Снимок экрана ниже), я вижу, что процессы создаются и заканчиваются постоянно, но код в TestMethod не запускается, и служба не выходит из пула, потому что ничего else записывается в файл.
Я не могу остановить службу, так как она застряла в бассейне и не доходит до проверки события остановки.
Почему код внутри TestMethod не работает вообще? Код
Услуги:
import servicemanager
import win32event
import win32service
import win32serviceutil
import multiprocessing
class TestService(win32serviceutil.ServiceFramework):
_svc_name_ = "TestService"
_svc_display_name_ = "Test Service"
def testMethod(self, testVar):
with open('C:\\Test.log', 'a') as f:
f.write('The method is running: ' + testVar)
f.close()
def __init__(self, args):
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
def SvcStop(self):
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
with open('C:\\Test.log', 'a') as f:
f.write('The service started running...\n')
f.close()
rc = None
p = multiprocessing.Pool(5)
p.map(TestService.testMethod, range(1,6))
with open('C:\\Test.log', 'a') as f:
f.write('Finished method...\n')
f.close()
while rc != win32event.WAIT_OBJECT_0:
with open('C:\\Test.log', 'a') as f:
f.write('The service is running...\n')
f.close()
rc = win32event.WaitForSingleObject(self.hWaitStop, 5000)
with open('C:\\Test.log', 'a') as f:
f.write('StreamCapture service stopped.\n')
f.close()
if __name__ == '__main__':
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(TestService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(TestService)
'p.map (TestService.testMethod, диапазон (1,6))' - 'TestService.testMethod' - это несвязанный метод. В этом вызове 'p.map' нет экземпляра' TestService'. Какой объект вы ожидаете выполнить с помощью этого метода? – user2357112
Первоначально метод передается потоками видео, и он запускает ffmpeg и создает журналы. Я помещаю этот метод внутри класса, так как я думал, что он может запутаться в проблеме области, но он все еще работает в одной и той же проблеме, этот метод вполне может быть определен вне класса без себя, и он столкнется с теми же проблемами, что и сейчас. , –