Bubai2019 Ответов: 2

Не могу засолить _thread.ошибка блокировки объектов при переходе объекта класса из основного процесса в дочерний процесс


I try to use Multiprocessing in a class.I use Multiprocessing.Pipe() to pass the instance o from parent process to child process.


Here I call the Multiprocessing.pipe():-


conn1, conn2 = multiprocessing.Pipe()


self.devices = bussiness.initilaztion(self.comm_object,logger)

conn1.send(self.devices)

self.callmotor1dprocess =

multiprocessing.Process(target=callallmotor1d,args=[conn2])

self.listofthread.append(self.callmotor1dprocess)

self.callsov1sprocess =

multiprocessing.Process(target=callallsov1s,args=[conn2])

self.listofthread.append(self.callsov1sprocess)


Now Executed method I should call outside of the class.


def callallmotor1d(conn):
    devices = conn.recv()
    while True:
        bussiness.motorallprocessing(devices)


def callallsov1s(conn):
    while True:
        devices = conn.recv()
        bussiness.allsov1processing(devices)


Now I call all Multiprocessing Initiate <pre>

<pre lang="Python">

 def startprocess(self):
            for item in self.listofthread:
                item.start()
            self.button3.config(text="started")
    
       def stopprocess(self):
            for item in self.listofthread:
                item.kill()


Но я получил ошибку, которая очень распространена:-
Сообщение об ошибке:-

не могу засолить _thread.блокировка объектов
Обратная трассировка (самый недавний призыв последнего):
Файл "C:/Users/misu01/PycharmProjects/opcua/ui_v7.py", строка 226, in initialization conn1.send(устройства)
Файл "C:\Users\misu01\AppData\Local\Programs\Python\Python37\lib\multiprocessing\connection.py", строка 206, in send self._send_bytes(_ForkingPickler.dumps(obj))
Файл "C:\Users\misu01\AppData\Local\Programs\Python\Python37\lib\multiprocessing\reduction.py", строка 51, в dumps cls(buf, protocol).dump(obj)
TypeError: не могу рассолить _thread.блокировка объектов



Я не знаю, почему нить.объект блокировки создается в моем классе Alldevices.Я никогда не пользовалась нитками.запри дверь в моем классе.

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

To avoid this error I try to modify my Alldevices class like this:-
I use  __setstate__ and __getstate__ in my Alldevices class.
As per the document:-
<a href="https://docs.python.org/3/library/pickle.html#pickling-class-instances">pickle — Python object serialization — Python 3.7.4 documentation</a>[<a href="https://docs.python.org/3/library/pickle.html#pickling-class-instances" target="_blank" title="New Window">^</a>]

Here is my modification:-


class AllDevices:


def __init__(self,comobject,logger):
    self.mylock = threading.Lock()
    self._comobject = comobject
    dfM1D = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='Motor1D')
    dfM2D = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='Motor2D')
    dfsov1S = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='Valve1S')
    dfsov2S = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='Valve2S')
    dfanalog = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='AnalogTx')
    dfcontrolvalve = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='ControlValves')
    dfvibrofeeder = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='VibroFeeder')
    dfconveyor = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='Conveyor')
    dfdrives = pd.read_excel(r'D:\OPCUA\Working_VF1.xls', sheet_name='Drive')

    self.allmotor1dobjects = callallmotor1D_V1.Cal_AllMotor1D(dfM1D, comobject, logger)
    self.allmotor2dobjects =  callallmotor2D_V1.Cal_AllMotor2D(dfM2D,comobject,logger)
    self.allsov1sobjects = callallsov1S_V1.Cal_AllSov1S(dfsov1S,comobject,logger)
    self.allsov2sobjects = callallsov2S_V1.Cal_AllSov2S(dfsov2S, comobject,logger)
    self.allanalogobjects = calallanalog_V1.Cal_AllAnalogInputs(dfanalog,comobject,logger)
    self.allcontrolvalveobjects = calallcontrolvalves_V1.Cal_AllControlValve(dfcontrolvalve,comobject,logger)
    self.allvibrofeederobjects = callallvibrofeeder_V1.Cal_AllVibroFeeder(dfvibrofeeder,comobject,logger)
    self.allconveyorobjects = callallconveyor_V1.Cal_AllConveyor1D(dfconveyor,comobject,logger)
    self.allabbdrivesobjects = calallABPdrives_V1.Cal_AllDrives(dfdrives, comobject,logger)

    def __getstate__(self):
    # Copy the object's state from self.__dict__ which contains
    # all our instance attributes. Always use the dict.copy()
    # method to avoid modifying the original state.
    state = vars(self).copy()
    # Remove the unpicklable entries.
    del state['mylock']
    return state

def __setstate__(self, state):
    # Restore instance attributes.
    vars(self).update(state)
    self.mylock = threading.Lock()

@property
def allmotor1d(self):
    return self.allmotor1dobjects

@property
def allsov1s(self):
    return self.allsov1sobjects


But still I got an error.
Is this my implementation is correct?

Here self.allmotor1dobjects, self.allsov1sobjects etc are also class instances.I suspect that as if I called instances of classes in my alldevice class that reason it is not working.

How I can remove this error.

I am not sure multiprocessing.pipe() is correct way to send instance of class to main process to child process

Also I try to know how thread.lock() object is created in my alldevice class.

any help in this regard will be highly appreciated




No improvement in error:-

2019-09-06 10:54:17,835: can't pickle _thread.lock objects
Traceback (most recent call last):
  File "C:\Users\misu01\Desktop\SMS_SIMULATION\ui_v7.py", line 220, in initilization
    conn1.send(devices)
  File "C:\Users\misu01\AppData\Local\Programs\Python\Python37\lib\multiprocessing\connection.py", line 206, in send
    self._send_bytes(_ForkingPickler.dumps(obj))
  File "C:\Users\misu01\AppData\Local\Programs\Python\Python37\lib\multiprocessing\reduction.py", line 51, in dumps
    cls(buf, protocol).dump(obj)

2 Ответов

Рейтинг:
2

Member 14622393

Объект, который вы хотите сбросить, не может быть замаринован модулем pickle.Вам нужно изменить тип объекта на string или int и вы можете идти :)


Рейтинг:
0

megaadam

Я погуглил ваше сообщение об ошибке и, похоже, регистратор содержит неявную блокировку. Старайтесь не проходить мимо лесоруба

[ссылка ^]


Bubai2019

Я прочитал документ, который вы отправляете по электронной почте.Возможно, проблема была вызвана регистратором.
Если я удалю регистратор, это не решит мою проблему, потому что я использовал регистратор для регистрации событий из процесса cild.
Если thread.lock() создан, то об этом следует позаботиться

def __getstate__(self):
# Скопируйте состояние объекта из self.__dict__ который содержит
# все наши атрибуты экземпляра. Всегда используйте dict.copy()
# метод, позволяющий избежать изменения исходного состояния.
государство = Варс(самовыдвижение).копия()
# Удалите непиклируемые записи.
del state['mylock']
вернуть государству

деф __выполнении функция setState__(самовыдвижение, государство):
# Восстановление атрибутов экземпляра.
Варс(самовыдвижение).обновление(государственный)
самостоятельно.mylock = нарезания резьбы.Замок()

megaadam

Я думаю, вам не стоит проходить мимо лесоруба. Дочерний процесс должен создать свой собственный регистратор, я думаю, что это было упомянуто в ссылке. Удачи.

Bubai2019

Я удаляю регистратор, но он мне не помогает.Я получил такую же ошибку