服务器端Ruby进程和客户端Javascript之间的通信

时间:2012-04-15 17:58:05

标签: javascript ruby ajax asynchronous background-process

上下文

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

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

考虑使用websockets。在我的Zend应用程序中,我编写了一个代理脚本,将数据包发送给JS。 另一种方法是使setTimeout在过程完成时每x秒询问一次http服务器。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

以下是我最终使用的策略:

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

有什么想法吗?