Я пишу сценарий python, использую многопроцессорность и win32service
import threading
import multiprocessing
import time
import sys
import socket
# windows service
import win32serviceutil
import servicemanager
import win32event
import win32service
import win32api, win32pdhutil, win32con
class A(object):
def __init__(self):
self.process = None
self.th = None
self.sender, self.receiver = multiprocessing.Pipe()
def run1(self, sender):
num = 0
while(True):
num = num + 1
sender.send(num)
def run2(self):
while(True):
if self.receiver.poll():
recv_num = self.receiver.recv()
print(recv_num)
def start(self):
self.process = multiprocessing.Process(target=self.run1, args=(self.sender,))
self.process.start()
self.th = threading.Thread(target=self.run2, args=())
self.th.start()
class PyWinService(win32serviceutil.ServiceFramework):
'''Base class to create winservice in Python'''
_svc_name_ = 'test'
_svc_display_name_ = 'test'
_svc_description_ = 'Fisheye test'
def __init__(self, args):
'''
Constructor of the winservice
'''
win32serviceutil.ServiceFramework.__init__(self, args)
self.hWaitStop = win32event.CreateEvent(None, 0, 0, None)
socket.setdefaulttimeout(60)
def SvcStop(self):
'''
Called when the service is asked to stop
'''
self.stop()
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
win32event.SetEvent(self.hWaitStop)
def SvcDoRun(self):
'''
Called when the service is asked to start
'''
self.main()
def start(self):
'''
Override to add logic before the start
eg. running condition
'''
def stop(self):
'''
Override to add logic before the stop
eg. invalidating running condition
'''
def main(self):
a = A()
a.start()
if __name__ == '__main__':
multiprocessing.freeze_support()
if len(sys.argv) == 1:
servicemanager.Initialize()
servicemanager.PrepareToHostSingle(PyWinService)
servicemanager.StartServiceCtrlDispatcher()
else:
win32serviceutil.HandleCommandLine(PyWinService)
Когда я запускаю сценарий на Windows 10, я получаю эту ошибку
File "<string>", line 1, in <module>
File "C:\Python37\lib\multiprocessing\spawn.py", line 99, in spawn_main
new_handle = reduction.steal_handle(parent_pid, pipe_handle)
File "C:\Python37\lib\multiprocessing\reduction.py", line 82, in steal_handle
_winapi.PROCESS_DUP_HANDLE, False, source_pid)
OSError: [WinError 87] The parameter is incorrect
Когда Я пишу другой сценарий без использования модуля win32service
import threading
import multiprocessing
import time
import sys
class B():
def __init__(self):
a = A()
a.start()
class A():
def __init__(self):
self.process = None
self.sender, self.receiver = multiprocessing.Pipe()
def run1(self, sender):
num = 0
for i in range(0, 10):
num = num + 1
sender.send(num)
def run2(self):
while(True):
if self.receiver.poll():
recv_num = self.receiver.recv()
print(recv_num)
def start(self):
self.process = multiprocessing.Process(target=self.run1, args=(self.sender,))
self.process.start()
th = threading.Thread(target=self.run2, args=())
th.start()
if __name__ == '__main__':
B()
Работает без ошибок
Я не понимаю, какой параметр неверен Я сделал что-то не так в основной функции PyWinService? Кто-нибудь может мне помочь, пожалуйста! Спасибо