【问题标题】:Communication between server-side Ruby process and client Javascript服务器端 Ruby 进程和客户端 Javascript 之间的通信
【发布时间】:2012-04-15 17:58:04
【问题描述】:

上下文

  • 我有一个应用程序在 Ruby 中对文本进行耗时的处理。
  • 当用户提交文本时,会派生一个后台进程来处理该文本。
  • 此过程会不断输出文本的新部分,因为它们已被处理。
  • 同时,用户被重定向到将输出已处理文本的页面。

我的问题是:在给定 PID 的情况下,客户端的 Javascript 如何与服务器上运行的进程通信?那可能吗?我是否需要将每个后台进程包装在其自己的 servlet 中,该 servlet 在其自己的端口上运行?

【问题讨论】:

    标签: javascript ruby ajax asynchronous background-process


    【解决方案1】:

    它无法访问进程空间。您需要一个 HTTP 接口来执行此操作。您可以使用长轮询来执行此操作。服务器可以定期输出文本,客户端脚本可以长轮询。

    在此处查看长轮询示例: How do I implement basic "Long Polling"?

    【讨论】:

      【解决方案2】:

      考虑使用 websocket。在我的 Zend 应用程序中,我编写了一个将数据包发送到 JS 的代理脚本。 另一种方法是 setTimeout 每隔 x 秒向 http 服务器询问进程是否已完成。

      【讨论】:

        【解决方案3】:

        最简单的方法是使用PusherPubNub 或类似的,因此您可以将代码推送到包含PID 的频道,客户端可以订阅相同的频道。这样您就无需设置 HTTP 应用程序。

        【讨论】:

          【解决方案4】:

          这是我最终使用的策略:

          • 创建一个小型 Sinatra servlet 来管理不同的作业。
          • 收到的每个作业请求都分配有一个作业 ID,并在分离的分叉进程中启动。
          • 分叉的进程使用用作堆栈的数组设置 DRb 服务。
          • 然后它在将作业 ID 与 DRb URI 相关联的 servlet 上执行“GET”请求。
          • 随着进程在后台继续执行,它会将元素添加到堆栈中。
          • 可以轮询主线程以返回堆栈中的下一个元素。
            • 在 servlet 中建立与远程数组的连接,并从堆栈中移动一个元素。
            • 轮询一直持续到堆栈中没有更多元素要添加并且没有更多元素要返回给客户端为止。
          • 当堆栈为空时,进程终止。

          有什么想法吗?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-11-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多