2

我必须编写一个程序,为同时访问多个资源(网络摄像头)的多个客户端提供服务。

示例:客户 A 和 B 都询问两个云台摄像机 A 和 B 的当前位置。我必须避免客户直接与该摄像机对话(因为可能有很多客户)所以我的想法是有一个流程对于每个客户端(通过套接字连接)和每个凸轮的进程。

如果客户端请求凸轮 A 的位置,则程序为该凸轮派生新进程,该进程重复轮询凸轮位置 10 秒,然后退出。在这 10 秒内,来自任何客户的每个位置请求都应由该 cam-A 进程提供服务。

问题是:cam 进程如何与客户端进程通信?我天真的方法是使用 cam 进程写入和客户端进程读取的全局变量(camA-posX、camA-posY、camB-posX、camB-posY...)。我什至不知道分叉进程之间的全局变量是否可能。

我的第二种方法是使用perlipc/Safe Pipe Opens中的管道,但这仅涵盖父子通信。

另一个问题:必须有人(父进程?)必须决定我是否必须分叉一个新的 cam 进程或者它是否仍在运行。

也许最好编写两个程序(使用第二种方法),一个用于客户端,一个用于相机,它们通过单个套接字相互通信。

如果凸轮和客户端的数量增加,甚至可能需要扩展整个事物以分配负载。

4

1 回答 1

2
  • 您不能使用全局变量。一旦进程被分叉,它们就不再共享内存空间,因此全局变量在它们之间是不同的。您只能对线程执行此操作,并且需要非常小心地使用共享内存进行通信(就像线程并发编程中的任何事情一样:)

  • 对于较低级别的 IPC,请使用IPC::Msg

  • 老实说,如果您需要担心扩展,我会认真建议您跳出 IPC 框,并使用真实的数据库来管理您的通信。

    它可以是关系数据库,也可以是 noSQL 数据库,只要它是保证事务原子性的数据库。mySQL 应该可以正常工作。

  • 另一种类似的方法(如果 DB 有点矫枉过正)是使用消息队列,如下所述:“ A queuing system for Perl

  • 讨论了其他一些解决方案:

于 2013-07-23T16:09:37.620 回答