OSError: [WinError 87] Параметр неверен при использовании службы Windows в python - PullRequest
0 голосов
/ 16 июня 2020

Я пишу сценарий 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? Кто-нибудь может мне помочь, пожалуйста! Спасибо

...