我说对了吗?如果我的操作系统带有IPC(进程间通信)和线程,则可以简单地将其用作参与者模型。因此,我使用IPC发送和接收消息,并以线程的形式启动新角色(实际上是进程,因为我不共享内存)。还是我错过了actor模型为了符合需求而需要的某些功能?
- 演员需要一个地址:PID
- 将消息发送给其他参与者:IPC
- 创建新参与者:流程
这确实是可能的:正如您所说的,所有构件都在那里。
不过,这似乎不太适合:在参与者模型中进行编程时,通常会创建许多参与者,因此参与者应该“便宜”。不幸的是,在大多数操作系统上,进程并不便宜:
pid_max
来解决这个问题,但这已经表明您可能会误用此工具总而言之,这是有可能的,但是我不确定这是一个好主意。看到它在尝试时如何播放会很有趣!
,是的,您可以创建简单的IPC角色模型,例如乒乓球。但是,有一些问题:
您打算如何监督产生的演员?即或者您将要收到SIGCHILD
,然后主管(又称父进程)将几乎不了解失败的原因,或者从子到主管开发一些更复杂的消息,即描述失败原因。
Actor应该彼此通信,即将有N对N的逻辑连接。您计划使用哪种IPC机制?使用共享内存(因为actor的数目是动态的并且在运行时进行配置)或为每对actor使用套接字将非常困难。套接字在系统中也受限制,并且它们将很快耗尽(O(N ^ 2),N-角色数量)。
您打算如何进行演员发现?即例如,您需要一个提供特定服务的特定演员。 Actor通过PID
进行标识(系统定义的,从程序角度来看是不可预测的)。 actor-X如何能够发现actor-Y的PID
,您知道应该提供某些Y服务吗?您可以在启动时预先生成所有参与者,然后您将知道他们的所有地址(PIDs
),但是,您如何计划按需动态生成新参与者,并使已经生成的参与者知道新的{ {1}}?
在您的系统中,参与者之间传递消息的开销非常大,因为它将通过内核(即在进程之间切换)进行调解,而与使用哪个IPC无关。 sobjectizer每秒能够传递700万个乒乓消息(当它们在同一线程上,而200万个参与者在不同线程上时)。
我建议您查看参与者模型的现有C ++实现,即sobjectizer,caf或rotor,因为它们已经解决了所描述的问题(以及许多其他问题) 。