名称

Mojo::IOLoop-极简事件循环

简介

使用Mojo::IOLoop;#监听端口3000Mojo::IOLoop->server({port=>3000}=>sub($loop,$stream,$id){$stream->打开(读取=>sub($stream,$bytes){#处理输入块说$bytes;#写入响应$stream->write(“HTTP/1.1 200 OK”);});});#连接到端口3000my$id=Mojo::IOLoop->client({port=>3000}=>sub($loop,$err,$stream){$stream->打开(读取=>sub($stream,$bytes){#过程输入说“输入:$bytes”;});#写入请求$stream->write(“GET/HTTP/1.1\x0d\x0a\x0d\x0a”);});#添加计时器Mojo::IOLoop->timer(5=>sub($loop){$loop->remove($id)});#必要时启动事件循环除非Mojo::IOLoop->is_running,否则Mojo::IOLoop->启动;

说明

Mojo::IOLoop是一个基于Mojo::反应堆,它已被简化为构建可靠且可扩展的非阻塞客户端和服务器所需的绝对最小功能集。

根据操作系统的不同,默认的进程内和系统范围的文件描述符限制通常非常低,需要进行调整以获得更好的可伸缩性。这个LIBEV_堵塞还应该使用环境变量来选择最佳的电动汽车后端,通常默认为不太可扩展选择.

LIBEV_FLAGS=1#选择LIBEV_FLAGS=2#轮询LIBEV_FLAGS=4#epoll(Linux)LIBEV_FLAGS=8#kqueue(*BSD,OS X)LIBEV_FLAGS=64#Linux AIO

如果单调时钟可用,事件循环将对时间跳跃具有弹性时间::HiRes。TLS证书和密钥也内置在中,以便尽可能轻松地编写测试服务器。还要注意,为了方便起见管道信号将设置为IGNORE公司什么时候Mojo::IOLoop已加载。

为了获得更好的可扩展性(epoll、kqueue)并提供非阻塞名称解析、SOCKS5以及TLS支持,可选模块电动汽车(4.32+),网络::DNS::本机(0.15+),IO::插槽::插槽(0.64+)和IO::套接字::SSL如果可能,将自动使用(2.009+)。也可以使用禁用单个功能MOJO_NO_NNR公司,MOJO_NO_SOCKS运动鞋MOJO_NO_TLS公司环境变量。

请参见Mojolicus中的“实时网页”::指南::食谱了解更多信息。

活动

Mojo::IOLoop从继承所有事件Mojo::EventEmitter并且可以发射出以下新的气体。

完成

$loop->on(finish=>sub($loop){…});

当事件循环想要正常关闭并且正在等待关闭所有现有连接时发出。

重置

$loop->on(重置=>sub($loop){…});

当重置事件循环时发出,这通常发生在分叉进程以清理无法共享的资源之后。

属性

Mojo::IOLoop实现以下属性。

最大接受次数(_A)

我的$max=$loop->max_accepts;$loop=$loop->max_accepts(1000);

在正常关闭而不中断现有连接之前,此事件循环允许接受的最大连接数默认为0.将值设置为0将允许此事件循环无限期地接受新连接。请注意,可以随机减去此值的一半,以改善多个服务器进程之间的负载平衡,并确保不是所有进程都同时重新启动。

最大连接数

我的$max=$loop->max_connections;$loop=$loop->最大连接数(100);

在停止接受新的传入连接之前,此事件循环允许并发处理的最大接受连接数默认为1000.

反应堆

我的$reactor=$loop->reactor;$loop=$loop->reactor(Mojo::Rector->new);

低水平事件反应器,通常是Mojo::反应堆::轮询Mojo::电抗器::EV具有事件默认订户的对象Mojo::Reactor中的“error”.

#观察句柄是否可读写Mojo::IOLoop->singleton->reactor->io($handle=>sub($reactor,$writable){说$writable?”句柄可写':'句柄可读';});#仅当句柄变为可写时才更改为监视Mojo::IOLoop->singleton->reactor->watch($handle,0,1);#再次拆下把手Mojo::IOLoop->singleton->reactor->remove($handle);

方法

Mojo::IOLoop从继承所有方法Mojo::EventEmitter并实现了以下新功能。

受体

my$server=Mojo::IOLoop->acceptor($id);my$server=$loop->acceptor($id);my$id=$loop->接收器(Mojo::IOLoop::Server->new);

获取Mojo::IOLoop::服务器对象或将对象转换为接受器。

客户

my$id=Mojo::IOLoop->client(地址=>'127.0.0.1',端口=>3000,子{…});我的$id=$loop->客户端(地址=>“127.0.0.1”,端口=>3000,子{…});我的$id=$loop->客户端({地址=>“127.0.0.1”,端口=>3000}=>子{…});

使用打开TCP/IP或UNIX域套接字连接Mojo::IOLoop::客户端并创建流对象(通常Mojo::IOLoop::流),采用与相同的参数Mojo::IOLoop::Client中的“connect”.

正在运行(_R)

my$bool=Mojo::IOLoop->is_running;我的$bool=$loop->is_running;

检查事件循环是否正在运行。

下一个标签

my$undef=Mojo::IOLoop->next_tick(sub($loop){…});my$undef=$loop->next_tick(子($loop){…});

尽快执行回调,但在返回或使用此方法注册的其他回调之前,始终返回未定义.

#在下一个反应器刻度上执行操作Mojo::IOLoop->next_tick(sub($loop){…});

一次点击

Mojo::IOLoop->one_tick;$loop->one_tick;

运行事件循环,直到事件发生。

#阻挡时间不要超过0.5秒my$id=Mojo::IOLoop->计时器(0.5=>sub($loop){});Mojo::IOLoop->one_tick;Mojo::IOLoop->删除($id);

再发生

my$id=Mojo::IOLoop->循环(3=>子($loop){…});我的$id=$loop->循环(0=>子($loop){…});我的$id=$loop->循环(0.25=>子($loop){…});

创建一个新的循环计时器,在给定的时间(秒)后重复调用回调。

#每5秒执行一次操作Mojo::IOLoop->循环(5=>sub($loop){…});

去除

Mojo::IOLoop->删除($id);$loop->删除($id);

删除任何带有id的东西,连接将被优雅地删除,允许它们在写缓冲区中完成所有数据的写入。

重置

Mojo::IOLoop->重置;$loop->重置;$loop->重置({freeze=>1});

删除所有内容并停止事件循环。

这些选项当前可用:

冻结
冻结=>1

在重置之前及时冻结事件循环的当前状态。这将防止活动连接立即关闭,这有助于在进程分叉时消除许多意外的副作用。请注意,此选项是实验而且可能会毫无预警地发生变化!

服务器

my$id=Mojo::IOLoop->server(端口=>3000,子{…});我的$id=$loop->服务器(端口=>3000,子{…});我的$id=$loop->服务器({port=>3000}=>sub{…});

接受TCP/IP和UNIX域套接字连接Mojo::IOLoop::服务器并创建流对象(通常Mojo::IOLoop::流,采用与相同的参数Mojo::IOLoop::Server中的“监听”.

#在随机端口上侦听my$id=Mojo::IOLoop->server({address=>'127.0.0.1'}=>sub($loop,$stream,$id){…});my$port=Mojo::IOLoop->acceptor($id)->port;

单子

my$loop=Mojo::IOLoop->singleton;

全球Mojo::IOLoopsingleton,用于从进程内的任何位置访问单个共享事件循环对象。

#许多方法还允许您走捷径Mojo::IOLoop->计时器(2=>sub{Mojo:;IOLoop->stop});Mojo::IOLoop->启动;#重新启动活动计时器my$id=Mojo::IOLoop->timer(3=>sub{say‘Timeout!’});Mojo::IOLoop->singleton->reactor->again($id);#将文件描述符转换为句柄并观察其是否可读my$handle=IO::handle->new_from_fd($fd,'r');Mojo::IOLoop->singleton->reactor->io($handle=>sub($reactor,$writable){说$writable?”句柄可写':'句柄可读';})->手表($handle,1,0);

开始

Mojo::IOLoop->启动;$loop->开始;

启动事件循环,这将阻塞到“停止”被调用。请注意,如果不再有事件被监视,一些反应堆会自动停止。

#仅当尚未运行时才启动事件循环除非Mojo::IOLoop->is_running,否则Mojo::IOLoop->启动;

停止

Mojo::IOLoop->停止;$loop->停止;

停止事件循环,这不会中断任何现有连接,事件循环可以通过运行“开始”再一次。

优雅地停止

Mojo::IOLoop->stop_gracefully;$loop->stop_gracefully;

停止接受新连接并等待已接受的连接关闭,然后停止事件循环。

流动

my$stream=Mojo::IOLoop->stream($id);我的$stream=$loop->stream($id);my$id=$loop->stream(Mojo::IOLoop::stream->new);

获取Mojo::IOLoop::流对象或将对象转换为连接。

#将连接的非活动超时时间增加到300秒Mojo::IOLoop->流($id)->超时(300);

子流程

my$subprocess=Mojo::IOLoop->子进程;我的$subprocess=$loop->子流程;我的$subprocess=$loop->子流程(sub($subproprocess){…},sub($子流程,$err,@results){…});

生成Mojo::IOLoop::子进程对象在子流程中执行计算开销大的操作,而不阻塞事件循环。回调将传递给Mojo::IOLoop::子进程中的“运行”.

#将阻塞事件循环5秒的操作Mojo::IOLoop->子进程->run_p(sub{睡眠5;返回'♥', 'Mojolicious';})->然后(sub(@results){说“I$results[0]$results[1]!”;})->catch(子($err){说“子进程错误:$err”;});

计时器

my$id=Mojo::IOLoop->计时器(3=>子($loop){…});我的$id=$loop->计时器(0=>子($loop){…});我的$id=$loop->计时器(0.25=>子($loop){…});

创建一个新计时器,在给定的时间(秒)后调用回调。

#在5秒内执行操作Mojo::IOLoop->计时器(5=>sub($loop){…});

调试

您可以设置MOJO_IOLP_DEBUG公司将一些高级诊断信息打印到的环境变量STDERR公司.

MOJO_IOLP_DEBUG=1

另请参阅

莫乔利奇,Mojolicious::指南,https://mojolicious.org.