在同时运行的两个函数中访问同一对象的属性



你好,我遇到了一个奇怪的问题,也许有人可以帮忙, 我首先使用相同的参数运行 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()

看到这个答案。从本质上讲,正在发生的事情是,您的数据在被发送到流程以完成工作之前被"腌制"。收到对象后,它们将被解压缩。因此,对象被克隆的多于传递。因此,您实际上是在使用两个单独的iotComponent副本,这就解释了为什么即使您"知道"正在完成工作,您实际上也看不到其中一个副本发生的任何更改。鉴于此,可能有一种方法可以做到这一点。但是,最好不要使用Process,而是改用Thread,请参阅此处。不同之处在于,根据这一点,线程更适合 I/O 绑定操作,而您的传感器肯定是这样。

相关内容

  • 没有找到相关文章

最新更新