Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 事件总线和执行中的异步_Multithreading_Performance_Memory_Optimization - Fatal编程技术网

Multithreading 事件总线和执行中的异步

Multithreading 事件总线和执行中的异步,multithreading,performance,memory,optimization,Multithreading,Performance,Memory,Optimization,我挑战自己设计和实现(用Java,但仍在设计级别)事件总线,用于多线程。该系统在未来的计划中没有被认真使用,唯一感兴趣的是挑战本身及其优化 事件总线的设计是为了在事件触发和接收相关代码之间实现异步执行。但是,通过线程(EventManager)控制事件总线,我看到了两种可能的实现 我的问题是:如果这两个实现是最好的,那么哪一个呢? 1)EventManager线程调用订阅事件的每个系统,并按顺序运行其代码。 尽管这种解决方案在考虑发射器-接收器时确实是异步的,但在执行多个接收器时,我们仍然具有同

我挑战自己设计和实现(用Java,但仍在设计级别)事件总线,用于多线程。该系统在未来的计划中没有被认真使用,唯一感兴趣的是挑战本身及其优化

事件总线的设计是为了在事件触发和接收相关代码之间实现异步执行。但是,通过线程(EventManager)控制事件总线,我看到了两种可能的实现

我的问题是:如果这两个实现是最好的,那么哪一个呢?

1)EventManager线程调用订阅事件的每个系统,并按顺序运行其代码。 尽管这种解决方案在考虑发射器-接收器时确实是异步的,但在执行多个接收器时,我们仍然具有同步性。此外,如果某个接收器功能需要时间,则总线管理的整个执行都会延迟

2)每个接收器系统都有自己的缓冲总线,EventManager线程仅将事件重新传输到订阅的系统,使所用内存成倍增加(事件可以在多个系统中同时重写),但解决了同步问题

我想在一个典型的系统(即游戏、非计算密集型软件或时间关键型解决方案)中,第一个是最好的。第二种可能需要大量内存,而优化时间却不多


你以前有过这个问题吗?您有什么建议吗?

在这两者之间,您需要选择您的设计需求

对于备选方案1:

优点:

  • 按我的经验,顺序设计更容易设计和实现
  • 更易于控制和理解(因为您甚至可以实现优先级作为顺序的副作用)
  • 在每个受体之间传递的事件突变不需要同步,因为它是线程限制的
缺点:

  • 正如你们所讨论的,如果一个受体被阻断,其他受体也会受到影响
  • 由于顺序性,受体将无法利用并行计算
对于备选方案2:

优点:

  • 受体彼此独立运行(并提供更多并行化机会)
  • 只要事件一到达缓冲区就被处理,内存实际上不会受到不利影响
  • 阻塞的接收器可以使用缓冲区存储事件,以供以后处理,而不是挂起行
缺点:

  • 接受器必须协调好,以实现事件优先级等事项,并确保所有接受器(即使是那些阻止并让事件排队的接受器)一起完成
  • 突变事件要求提交接收器的客户端使用同步,以便保持数据与其他接收器的一致性
如果有什么区别的话,我个人会选择第二种选择,因为记忆常常会因为性能提高而受到影响。但是,如果您的目标客户不开发多线程客户端,或者同步很难实施,我会选择选项1,优先考虑安全性和可靠性。

EDIT我的意思是,在我的第二个场景中的选项1,我的坏。