服务器端 Ruby 进程和客户端 Javascript 之间的通信
Communication between server-side Ruby process and client Javascript
>上下文
- 我有一个应用程序,可以在 Ruby 中对文本进行耗时的处理。
- 当用户提交文本时,后台进程会分叉以处理该文本。
- 此过程在处理文本时不断输出新部分。
- 同时,用户被重定向到将输出处理后文本的页面。
我的问题是:给定PID,客户端的Javascript如何与服务器上运行的进程进行通信?这可能吗?我是否需要将每个后台进程包装在自己的端口上运行的自己的 servlet 中?
它无法访问进程空间。您需要一个 HTTP 接口来执行此操作。您可以使用长轮询来执行此操作。服务器可以定期输出文本,客户端脚本可以长时间轮询它。
在此处查看长轮询示例:如何实现基本的"长轮询"?
考虑使用 websockets。在我的Zend应用程序中,我编写了一个代理脚本,它将数据包发送到JS。另一种方法是使setTimeout每x秒询问一次http服务器,如果进程已经完成。
最简单的方法是使用 Pusher 或 PubNub 或类似方法,这样您就可以将代码推送到包含 PID 的通道,客户端可以订阅同一通道。这样,您无需设置 HTTP 应用程序。
这是我最终使用的策略:
- 创建一个小的Sinatraservlet来管理不同的作业。
- 收到的每个作业请求都分配有一个作业 ID,并在分离的分叉进程中启动。
- 分叉进程使用用作堆栈的阵列设置 DRb 服务。
- 然后,它在 servlet 上执行"GET"请求,将作业 ID 与 DRb URI 相关联。
- 当进程在后台继续执行时,它会将元素添加到堆栈中。
- 可以轮询主线程以返回堆栈中的下一个元素。
- 在 servlet 中建立与远程阵列的连接,并从堆栈中移动一个元素。
- 轮询将继续,直到没有更多元素要添加到堆栈中,也没有更多元素要返回到客户端。
- 当堆栈为空时,进程终止。
有什么想法吗?
相关文章:
- firefox插件和dev/panel之间的通信
- 如何在两个不同的iframe HTML之间进行通信
- Angularjs事件与发布/订阅指令之间的通信
- Firefox插件SDK:在侧边栏和主脚本之间通信对象
- Ember.js:接受的子组件和父组件之间通信的最佳实践
- 如何在Windows Phone 8.1应用程序中在C#和Javascript之间传递数据或通信
- 如何在Famo.us中的两个视图(不同的js文件)之间进行通信
- 在Jquery或Javascript中获取两个范围或日期之间的通信周数
- 如何在同源选项卡之间建立通信
- 如何在 PHP 和 JS 中的并发会话之间进行通信
- 如何在两个动画画布元素之间进行通信
- 在 HTML5 和 C# Web 套接字通信之间
- angularjs 中控制器和指令之间的通信
- 歌剧扩展脚本和它们之间的通信
- 如何使用js在两个aspx页面之间进行通信
- 多个应用程序之间的通信
- Socket.IO:如何在同一服务器中的Socket.on()事件之间通信/交换数据
- chrome扩展的浏览器操作、后台脚本和内容脚本之间通信的上下文和方法
- 使用PhoneGap/Cordova时应用程序和服务器之间通信的最佳实践
- 使用AJAX在两个JavaScript文件之间通信并发送数据