繁体   English   中英

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

[英]Communication between server-side Ruby process and client Javascript

语境

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

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

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

在此处查看长轮询示例: 如何实现基本的“长轮询”?

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

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

这是我最终使用的策略:

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

有什么想法吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM