Доступ к атрибуту одного и того же объекта в двух функциях, работающих одновременно - PullRequest
0 голосов
/ 27 сентября 2018

Здравствуйте, у меня странная проблема, может быть, кто-то может помочь, я начинаю с запуска 2 разных функций с одним и тем же аргументом, который является объектом, который уже создан:

iotComponent.connectedSensors=sensorList
iotComponent.connectedHUIs=HUIList

Coap = multiprocessing.Process(target=runCoapSync,args=(iotComponent,))
huis = multiprocessing.Process(target=runHuis,args=(iotComponent,))
huis.start()
Coap.start()

, тогда вот обе функции:

async def runCoap(iotDevice):

    context = await Context.create_client_context()
    sensor=iotDevice.connectedSensors[0]
    while True:
        await asyncio.sleep(1)
        sensor.sense()
        lightMsg = iotDevice.applicationInterface.createMsg( sensor, iotDevice.communicationProtocol.name)
        await iotDevice.communicationProtocol.sendMsg(context,lightMsg,"light")


def runHuis(iotDevice):
    print("----------------1---------------")
    LCD=iotDevice.connectedHUIs[0]
    while True:
        LCD.alertHuman(iotDevice.connectedSensors[0].data.value)

в первой функции, когда вызывается sensor.sense(), атрибут значения внутри атрибута данных датчика обновляется.

Но во второй функции iotDevice.connectedSensors[0].data.value всегда равенв ноль.Я нахожу это поведение странным, потому что это тот же объект.Более того, если я добавлю строку sensor.sense() во вторую функцию, значение будет обновлено, но оно не совпадает со значением, напечатанным в первой функции.

РЕДАКТИРОВАТЬ 0: вот метод sense ():

 def sense(self):
        pinMode(self.pinNumber, "INPUT")
        lightSensorValue = analogRead(self.pinNumber)
        self.data.timestamp=str(round(time.time(), 3))
        self.data.value=lightSensorValue

Если у кого-то есть идея, которая была бы великолепна!

РЕШЕНИЕ: как сказано в принятом ответе, я попытался с многопоточностью, и это сработало как шарм:

Coap = threading.Thread(target=runCoapSync,args=(iotComponent,))
huis = threading.Thread(target=runHuis,args=(iotComponent,))
huis.start()
Coap.start()

1 Ответ

0 голосов
/ 27 сентября 2018

См. этот ответ.По сути, происходит то, что ваши данные «засоряются» перед отправкой в ​​процессы для выполнения работы.Когда объекты получены, они распакованы.Поэтому объекты более клонированы, чем переданы.Таким образом, вы на самом деле работаете с двумя отдельными копиями iotComponent, что объясняет, почему вы на самом деле не можете видеть никаких изменений, происходящих на одной, даже если вы «знаете», что работа выполняется.Может быть способ сделать это, учитывая это .Однако может быть лучше не использовать Process, а вместо этого использовать Thread, см. здесь .Разница в том, что, согласно this , потоки лучше подходят для операций, связанных с вводом / выводом, чем, безусловно, является ваш датчик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...