加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

使用AnyEvent创建单个线程服务器(Perl)

发布时间:2020-12-16 06:18:49 所属栏目:大数据 来源:网络整理
导读:我正在创建一个本地服务来监听localhost并提供一个基本的调用和响应类型接口.我想要开始的是一个婴儿服务器,您可以通过telnet连接并回应它收到的内容. 我听说AnyEvent对此非常有用,但是AnyEvent :: Socket的文档并没有给出一个很好的例子.我想用AnyEvent,Any
我正在创建一个本地服务来监听localhost并提供一个基本的调用和响应类型接口.我想要开始的是一个婴儿服务器,您可以通过telnet连接并回应它收到的内容.

我听说AnyEvent对此非常有用,但是AnyEvent :: Socket的文档并没有给出一个很好的例子.我想用AnyEvent,AnyEvent :: Socket和AnyEvent :: Handle构建它.

现在,小服务器代码如下所示:

#!/usr/bin/env perl

use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::Socket;

my $cv = AnyEvent->condvar;

my $host = '127.0.0.1';
my $port = 44244;

tcp_server($host,$port,sub {
    my($fh) = @_;

    my $cv = AnyEvent->condvar;

    my $handle;
    $handle = AnyEvent::Handle->new(
        fh => $fh,poll => "r",on_read => sub {
             my($self) = @_;
             print "Received: " . $self->rbuf . "n";
             $cv->send;
        }
    );

    $cv->recv;
});

print "Listening on $hostn";

$cv->wait;

这不起作用,如果我telnet到localhost:44244我得到这个:

EV: error in callback (ignoring): AnyEvent::CondVar: 
recursive blocking wait attempted at server.pl line 29.

我想如果我理解如何创建一个小的单线程服务器,我可以通过telnet连接并打印出它给出的任何内容,然后等待更多的输入,我可以从那里进一步采取它.有任何想法吗?

解决方法

你在回调中阻止了.这是不允许的.有几种方法可以解决这个问题.我的偏好是从tcp_server回调中启动一个 Coro线程.但是如果没有Coro,这样的事情可能就是你想要的:

#!/usr/bin/env perl5.16.2

use AnyEvent;
use AnyEvent::Handle;
use AnyEvent::Socket;

my $cv = AE::cv;

my $host = '127.0.0.1';
my $port = 44244;

my %connections;
tcp_server(
           $host,sub {
               my ($fh) = @_;

               print "Connected...n";

               my $handle;
               $handle = AnyEvent::Handle->new(
                                               fh => $fh,poll => 'r',on_read => sub {
                                                   my ($self) = @_;
                                                   print "Received: " . $self->rbuf . "n";
                                               },on_eof => sub {
                                                   my ($hdl) = @_;
                                                   $hdl->destroy();
                                               },);
               $connections{$handle} = $handle; # keep it alive.

               return;
           });

print "Listening on $hostn";

$cv->recv;

请注意,我只等待一个condvar.我正在存储句柄以使AnyEvent :: Handle对象保持更长时间.清理$self-> rbuf的工作是留给读者的例外:-)

问题交叉发布,answer,too

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读