并行Observer模式在实时系统中的应用

2018-08-21 09:24孙瑜郭新东
计算机时代 2018年6期
关键词:设计模式线程

孙瑜 郭新东

摘 要: 为了使实时系统中大量数据更新能够及时反馈到相应的模块中,设计了多个主题更新数据的Observer改进模式。该模式使用并行的方式通知相关注册的观察者模块,通过为每个通知方开启独立线程的方式,使得主线程和各模块线程都不被阻塞,并且保证数据更新及时有效。将该设计运用到温室环境监测系统中后,传感数据基本能够及时更新到仪表面板及相应的监测点中,满足一定的实时性。

关键词: Observer; 设计模式; 线程; 实时系统

中图分类号:TP309 文献标志码:A 文章编号:1006-8228(2018)06-64-03

The application of parallel Observer pattern in real time system

Sun Yu, Guo Xindong

(College of Information and Engineering, Shanxi Agricultural University, Jinzhong, Shanxi 030800, China)

Abstract: In order to timely feedback a large number of data updates to the corresponding modules in the real-time system, the improved Observer pattern with multiple theme updating data is designed. This pattern uses a parallel way to notify the related registered observer module by opening an independent thread for each notification party, making the main thread and the module threads not blocked, and ensuring that the data updates are timely and effective. When this design is applied to the greenhouse environmental monitoring system, the sensing data can be updated to the panel and the corresponding monitoring points in time, which meets the need for real time.

Key words: Observer; pattern design; thread; real time system

0 引言

实时性系统通常对数据更新的实时性有一定的要求,如温室环境监测实验平台需要使大量传感设备发送来的原始数据持久化,同时还要对原始数据进行清洗处理,去除异常数据后执行必要运算,然后以可视化的形式呈现在各仪表面板上。传感设备的平均数据发送频率为每秒数次,一个温室中数百个传感器同时回传至服务器上的数据量则达到近千次,若考虑在大型试验田中部署传感网络,回传的数据量将更加庞大,若服务器程序处理不当,则可能发生数据丢失而导致数据不完整[1]。

设计模式中的Observer模式(观察者)定义了主题和观察者两种角色,在同一问题域中,主题和观察者之间实现了一对多的关系。当主题中的状态发生变化时,多个观察者会得到通知,并执行相应的更新动作。Observer模式中的订阅/通知方式可以运用到温室环境监测平台中以解决传感器数据不能及时更新到仪表面板的问题。为多个相互之间具有联系的传感器建立一个复合主题,当主题中的数据更新时,通知已订阅该主题的观察者,即将数据处理后反馈到相应的仪表面板上。由于数据较多且数据的更新频率较高,加之通知观察者所需处理数据的流程各不相同而导致各仪表观察者的更新过程所需执行时间长短不一。若各观察者执行更新的时间总和过长则会导致下一次数据到达时不能得到及时处理而丢失数据[2]。对此,采用并行方法为每个观察者的更新方法启动一个独立的线程,从而使主题的更新时间大大缩短,不影响下一次数据到达时的更新。

1 Observer模式

1.1 传统Observer模式

Observer模式是Gof经典设计模式中行为模式的一种,定义了一种对象间的一对多的关系,即一个主题对应多个观察者。当主题状态发生改变时,所有注册在该主题上的观察者都会被通知。

传统的Observer模式实现关键在于主题(Subject)对象和观察者(Observer)对象,理论上一个主题对象可以有任意数目的观察者对象。当主题对象上发生某些事件触发状态变化时,所有依赖于它的观察者都将被依次通知,然后观察者执行自身更新动作。传统Observer模式结构如图1所示。

1.2 存在的問题

虽然理论上Observer模式可以注册任意数目观察者,但实际环境中往往受限于设备性能、主题状态更新频率及观察者自身更新动作复杂度,主题注册的观察者数目往往需要视具体环境而定,且不能过多。具体体现出的问题如下:

⑴ 如果主题状态的更新频率偏高,且需要更新的数据量较大时,则可能出现上一次更新未完成而下一次要更新的数据已到达的情况。此种情况则需要设置缓存队列对未能及时更新出去的数据进行缓冲,增加了系统的复杂性,且对系统的性能会造成一定影响。如果缓存机制设置不当,则可能出现缓存区溢出的问题,导致数据丢失。

⑵ 如果观察者的更新动作比较耗时,则以传统的串行方式顺序执行所有观察者的动作就可能阻塞整个系统进程。

⑶ 传统的Observer模式在数据更新时有“PUSH”和“PULL”两种方式,采用“PUSH”方式,主题需要了解观察者需要的数据格式,在观察者更新动作不同的情况下过于复杂。若采用“PULL”方式,则要求主题向观察者传递引用,需处理数据并行访问的问题。

2 改进的Observer模式

针对上述问题,设计出一种基于多线程的并行Observer模式,可以解决主题数据过于庞大及注册观察者过多而导致的数据更新不及时的问题。通过在主题中设置线程接口,以观察的引用作为接口参数,为每个观察者的更新动作分配一个独立的线程,即使在主题数据更新频率过高的时候也能在很大程度上保证主线程不被阻塞[3]。

2.1 基于多线程的状态更新

针对传统Observer模式中以串行方式执行观察者更新动作可能导致的阻塞,在改进的Observer模式中为每一个观察者的动作执行都启动一个新的线程,而执行遍历观察者的主线程则可以及时返回[4]。使用该设计主线程在为观察者执行更新动作期间所需等待的时间只有启动线程所需的时间,而使用成熟的线程框架这部分时间几乎可以忽略,因此,主线程可以在两次状态更新之间完成对所有注册观察者的动作更新。其流程如图2所示。

2.2 基于“PULL”方式的数据更新

观察者对主题状态变化所引起的数据更新兴趣不一,使得主题将数据统一推送到观察者的动作方法中变得难以实现[5]。在主题需要更新大量数据的情况下,使用“PULL”的方式更加行之有效。

为了避免数据格式重复定义,在以“PULL”的方式进行数据更新时不以特定的数据格式作为数据传输的载体。在更新数据的时候统一为观察者传递注册主题的引用,观察者需要使用特定的数据则都可以从主题对象中获取。如图3所示。

由于观察者对数据的需求仅为读操作,因此不存在同步问题,在一定程序上避免了并行编程中数据同步的时间代价。若需求中涉及需要对主题中的数据做修改的操作,则必须在主题中为观察者提供同步的接口,以保证数据的正确性。

3 在温室监测平台中的应用

在大型温室环境中,存在大量的传感器或传感设备需要不断的采集现场数据并及时的传送至服务器。这些传感器之间并不一定存在关联关系,收集的数据则需要和收集时间绑定。数据的使用者通常是各类温室管理系统,需要使用这些即时数据对温室环境进行控制,及时的将环境数据反馈到数据使用者。

由于各数据使用者对数据的兴趣点并不会一致,所以可将传感数据按需分组,并归入对应的主题,各系统模块则根据自身兴趣点注册主题。一旦主题中数据更新,则使用并行的方式为每个观察者模块开启独立的线程进行通知。在此过程中,主线程并不会被通知操作阻塞,也不会影响传感数据的接收。经测试,使用该改进模式开发的温室监测平台可以在保证数据实时性的前提下稳定运行。

4 结束语

使用基于并行的Observer模式可以有效解決主题状态更新频率过高和观察者更新动作较为复杂的问题。将该模式应用于温室监测实验平台中,系统可以及时的将大量传感设备发送来的数据更新至相关仪表面板上,且不会发生阻塞现象。然而,线程的启动仍是相对耗时的操作,后续的研究将在于提高线程资源的复用率,则可以进一步提高主题状态更新频率和扩展注册观察者的数目。

参考文献(References):

[1] 宋善德,陈辉,桂行东.基于Observer模式的异步Web服务技

术架构的构建及应用[J].计算机工程与科学,2004.26(4):1-3

[2] 杨斌,张卫冬,张利欣等.基于Ajax的Observer模式客户端研

究[J].计算机工程,2010.36(24):4-5

[3] 郭丽丽,王清心,胡建华等.应用AOP技术实现Observer模式[J].

计算机技术与发展,2007.17(6):70-73

[4] 刘健,董倩兰.Observer模式在.NET多线程并行计算中的应

用[J].计算机时代,2010.11:13-16

[5] 吴清寿.基于事件机制的观察者模式及应用[J].重庆理工大

学学报,2012.26(9):100-104

猜你喜欢
设计模式线程
“1+1”作业设计模式的实践探索
设计模式挖掘的有效性评估策略
三维协同设计模式下的航天项目管理实践与展望
基于国产化环境的线程池模型研究与实现
交通机电工程设计模式创新探讨
浅谈linux多线程协作
线程池技术在B/S网络管理软件架构中的应用
互动式设计模式研究
基于上下文定界的Fork/Join并行性的并发程序可达性分析*
Linux线程实现技术研究