我需要在perl中编写客户端服务器应用程序。许多客户端将发送请求,并将通过服务器进行处理。
开发此类客户端服务器应用程序的最佳方法是什么。我搜索了网页,发现LWP和IO :: Socket是可能的竞争者。
处理多个客户端的最佳方法是什么?这是fork分离进程还是使用线程来处理许多客户端。
这是我第一次在perl上进行客户端 - 服务器编程时很困惑。
答案 0 :(得分:4)
好的,所以 - 处理多个并发客户端的问题是你需要处理异步传入数据。通常情况下 - 从套接字(或文件句柄)读取是一种阻止操作,这意味着一个客户端将会关闭'其他。
处理此问题的两种主要方法 - 一种是使用IO::Select
和can_read
等文件描述符以非阻塞方式读取 - 然后测试哪个套接字有待处理的IO,处理它并重复。
来自文档:
use IO::Select;
use IO::Socket;
$lsn = IO::Socket::INET->new( Listen => 1, LocalPort => 8080 );
$sel = IO::Select->new($lsn);
while ( @ready = $sel->can_read ) {
foreach $fh (@ready) {
if ( $fh == $lsn ) {
# Create a new socket
$new = $lsn->accept;
$sel->add($new);
}
else {
# Process socket
# Maybe we have finished with the socket
$sel->remove($fh);
$fh->close;
}
}
}
或者您可以使用threads
或forks
进行多重处理 - 当您执行此操作时,您可以拆分'您的流程,并运行单独的实例,每个实例负责一个客户端。
您采取的这些方法主要取决于您尝试完成的任务。 fork
对于快速高效启动特别有用,因为它在POSIX操作系统上本机实现。但是,它不像进行进程间通信(IPC)那么友好,所以如果你的客户需要进行沟通......我个人也不会。
如评论中所述 - 可以在perlipc
线程类似于分叉 - 它不是perl文档推荐的,因为它的不是轻量级。但它确实使您的线程之间的通信过程变得更加容易。如果您这样做,我建议您查看threads
,threads::shared
和Thread::Queue
。
使用非阻塞读取方法意味着您可以完成所有这些操作而无需进行分叉或线程,但只有在您执行“小”操作时才能正常工作。每次迭代的事情 - 每个传入的客户端将在您处理下一个时停止,这可能意味着更多的延迟。 (尽管这可能无关紧要)。
Perlmonks还有一些不同客户类型的示例:http://www.perlmonks.org/?node_id=436988