首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >变化莫测不以非阻塞方式工作。

变化莫测不以非阻塞方式工作。
EN

Stack Overflow用户
提问于 2014-08-07 10:05:11
回答 2查看 751关注 0票数 1

一开始,我很抱歉我不擅长英语。

我在做一个有趣的应用程序。

我的控制器使用Mojo::UserAgent做了一些工作,并在输出时使用结果。

代码语言:javascript
复制
my $ua = Mojo::UserAgent->new();
my $tx = $ua->head( $location );
my $result;

if ( $tx->res->code eq '200' ) {
    $result = 'good';
}
else {
    $result = 'bad';
}

# pass the result to the renderer's stash
$self->render( result => $result );

这个代码很好用。--它同时工作在我的本地机器和服务器上。

接下来,我尝试使这种$ua->head()非阻塞方式,因为它可能需要很长的时间来完成。(我是个新手,这是我第一次尝试使用Mojo的非blokcing代码,供您参考)

代码语言:javascript
复制
my $ua = Mojo::UserAgent->new();
my $result;

$self->render_later;
$ua->head( $location => sub {
    my ($ua, $tx) = @_;

    if ( $tx->res->code eq '200' ) {
        $result = 'good';
    }
    else {
        $result = 'bad';
    }
    $self->render( result => $result );
});
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

这种方法在我的本地机器中也能很好地工作(MacBook OSX 10.9.4,Perl5.18,独立使用morbo)。

但是,当我在服务器中启动这段代码时,服务器会响应“404Notfind”.。

此服务器使用Nginx代理,它将请求转发到工作节点。

browser -- Nginx -- Mojolicious App

因此,我想这个代理与我的问题有关,但我不知道如何解决它。我甚至不知道我要从哪里开始找出确切的原因。

如有任何建议,将不胜感激。

我应该说“阻塞方法”在我的本地机器和服务器上都很好。只有“非阻塞方法”显示了这个问题。

更新(2014-08-21):我的一个朋友是一位熟练的Perl工程师,他对我说,这似乎是Mojo事件循环和PSGI事件循环之间的问题,也就是说,类似于兼容性问题。我不明白他现在说了些什么,但我正在努力学习。

EN

回答 2

Stack Overflow用户

发布于 2014-08-07 10:08:22

来自莫灼烹饪书

代码语言:javascript
复制
upstream myapp {
  server 127.0.0.1:8080;
}
server {
  listen 80;
  server_name localhost;
  location / {
    proxy_pass http://myapp;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto "http";
  }
}
票数 1
EN

Stack Overflow用户

发布于 2014-08-08 08:07:04

我认为该代理运行良好,因为您有http 404 (而不是http 502或其他什么)。

你也必须在你的服务器上运行变化莫测的应用程序,并使用“打印”调试你的应用程序。

我认为您的控制器操作找不到或找不到模板。

顺便问一下,什么是$self->render(result = $result)?也许你想写它$self->render(result => $result)

因此,如果这是您的问题,那么要检测这个错误,您应该查看log/development.conf ment.conf或log/production.conf,或者在运行app的控制台中。

UPD。

我不知道,哪里有问题,但这段代码会运行良好。

代码语言:javascript
复制
  my $result;

  $self->render_later;
  $self->ua->head('http://ya.ru' => sub {
      my ($ua, $tx) = @_;

      print $self->dumper($ua);


      if ( $tx->res->code eq '200' ) {
          $result = 'good';
      }
      else {
          $result = 'bad';
      }
      sleep 2;
      $self->render( data => $result );
  });
  Mojo::IOLoop->start unless Mojo::IOLoop->is_running;

因此,$ua变量来自于控制器$self。因此,当垃圾收集器调用回调时,它可能会破坏。当您使用$self->ua->...时,ua对象保存在共享变量中,因此垃圾收集器不会销毁它。非常有趣的例子。谢谢。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25179652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档