作为后续行动,我想我会发布一个简化版本,说明我如何解决我的问题,以防它帮助其他人。
使用 in 中使用的{handle}
元素,我手动设置了和的回调。AnyEvent::Handle
writer
on_drain
on_error
当on_drain
写缓冲区为空时调用。因此,处理程序使我的数据生成代码能够继续生成数据。
当调用数据生成回调时,数据被写入响应并禁用/暂停数据生成。
当on_drain
处理程序再次启用数据生成时,循环继续。
这可以保持writer
检查的内存使用情况,现在使用最少的内存来处理大型流式响应。我似乎仍然有一些缓慢的内存泄漏问题,但这可能很深,我是我在其他地方的代码。
sub call {
my ($self,$env)=@_;
#URL/path matching here
my $myASYNCObject; #Complicated async object setup
my $onDrain= sub { #on_drain handler
$myAsyncObject->continue; #tell generation code to continue
};
return sub {
#Boilerplate for streaming response
my $responder=shift;
my $resCode=200;
my $resHeaders=[...];
my $writer=$responder->([$resCode,$resHeaders]);
#Setup callback and start data generation
$myAsyncObject->setCallback=sub{
my $myData=shift;
$writer->write->($myData); #Write the data
$myAsyncObject->pause; #Tell generation code to pause
};
$writer->{handle}->on_drain( #Setup on_drain handler
sub {
$myAsyncObject->continue; #tell generation code to continue
}
);
#Error handlers here...
}
}