perl - 如何在 Perl 脚本的两个分支部分之间建立 IP 通信

标签 perl sockets ipc fork

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

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

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

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

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

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

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

如果摄像头和客户端的数量增加,甚至可能需要扩展整个设备以分配负载。

最佳答案

  • 您不能使用全局变量。一旦进程被 fork ,它们就不再共享内存空间,因此全局变量在它们之间是不同的。您只能通过线程来做到这一点,并且使用共享内存进行通信需要非常小心(就像线程并发编程中的任何事情一样:)

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

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

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

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

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

关于perl - 如何在 Perl 脚本的两个分支部分之间建立 IP 通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17814238/

相关文章:

linux - mmap 文件支持的映射与 Linux 中的匿名映射

perl - 制作一个运行24/7并从命名管道读取的Perl守护程序

perl - perl require 语句有必要吗?

ruby-on-rails - Ruby Socket-通过Socker运行方法

sockets - C中的套接字 'listen'错误

python - 用于异步任务的 celery 任务注册表

c - 如何在Windows中随时(同时)发送数据?

python - 从一个 csv 文件中的数据创建多个 csv 文件

Perl Tkx 示例或教程

java - 使用 android 和 Java 套接字连接到服务器,并需要用户的许可