你好,我遇到了一个奇怪的问题,也许有人可以帮忙, 我首先使用相同的参数运行 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 绑定操作,而您的传感器肯定是这样。