问题标签 [long-running-processes]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
asp.net-mvc-2 - 我可以在以下场景中使用异步控制器吗?
我在 Asp.net MVC 中有一个应用程序,有时我想向用户显示一个模式对话框,该对话框将显示流程执行进度指示器。
幕后的过程进行了大量的数据库数据处理(基于现有数据,它生成大量结果记录,这些记录也被写回数据库)。过程可能需要很短的时间到很长时间(取决于现有数据)。
应用程序将异步启动此过程(通过 Ajax 请求)并以相同的方式显示进度。
问题
我已经阅读了一些关于异步控制器的信息,其中可以异步启动一个进程并通知它的结束,但没有进度指示,我不确定如何处理浏览器超时。就客户端而言,异步请求与同步请求相同。因此,客户将等待响应(据我了解)。主要区别在于服务器将以异步方式执行某些操作,因此它不会阻止其他传入请求。我实际上应该做的是:
- 发出一个请求,该请求将启动该进程并响应客户端 taht 进程已启动。
- 客户端会定期轮询服务器以获取进程进度状态,并立即以百分比值返回响应(可能为 JSON)
- 当进度为 100% 时,这意味着它结束了,因此客户会知道要请求结果。
我不相信异步控制器以这种方式工作......
问题是我不确定我是否了解异步控制器,因此不确定我应该使用哪种方法来解决刚刚描述的这个问题?我自己看到了两种可能性:
- Asp.net MVC 异步控制器,如果它们可以以这种方式工作
- 根据请求处理数据并报告其进度的 Windows 服务应用程序 - 该服务将通过使用正常控制器操作将特定记录写入数据库来启动;这将启动它,然后服务会将其进度状态写入数据库,以便我的 Asp.net MVC 应用程序能够在客户端进程轮询请求中读取它。
android - 在单独的线程更新 UI 中长时间运行的进程
我注意到 dot NET 也有类似的问题,但我的问题是针对 Android 的,所以可能解决方案看起来不同。
通过单击按钮激活该过程。该进程作为 UI 线程的一部分运行,最后它确实更新了 UI。我添加了进度对话框以更加用户友好,因此我实例化了一个运行该进程的线程,最后它更新 UI 并关闭进度对话框。不幸的是,UI 更新失败,但有以下例外:
如果我尝试阻止 UI 线程并在完成更新 UI 的长时间过程后释放它,则不会显示进度对话框。我应该尝试在单独的线程中显示进度对话框,还是有另一个更简单的解决方案?
php - 如何检测 PHP CLI 脚本处于挂起状态
我正在使用主管(http://supervisord.org/)来守护一个相当标准的 PHP 脚本。该脚本的结构类似于:
今天,这个脚本(已经相当稳定一段时间了)挂了。它没有崩溃(即发出 SIGHUP 或 SIGTERM 信号),这会提醒 supervisord 重新启动进程。它在处理过程中没有遇到任何错误,这些错误要么被脚本捕获,要么至少触发了致命错误并退出。而不是这些“可捕获”的场景,它只是坐在那里。我们确实有一个 cron 作业设置,每小时运行一次,以通过 supervisorctl 钩子重新启动脚本,因为似乎普遍认为 PHP 脚本在内存方面存在泄漏,如果运行时间很长,最好重新启动。该脚本在重新启动后正常恢复操作。
我的问题:如何检测到该脚本已挂起?如果我没有以某种方式提醒我该状态,我什至无法开始诊断或解决它为什么挂起的问题。我正在寻找解决此问题的软件解决方案,或者我可以采用某种方法自行编写解决方案(在 PHP、Python、perl 或 shell 中)。
该脚本是用 PHP 5.2.6 编写的,并在最新的 RHEL 5 服务器上运行。
请让我知道我是否可以分享任何其他信息,如果它有助于提供更棒的解决方案。
谢谢!
沙希布·R。
twisted - 如何在 Twisted 中生成长时间运行的进程
前言
我正在编写一个网络服务器,让用户可以访问一些用 C 编写的程序(我在这个 C 程序上使用 Python 包装器,它是PyCLIPS)。为了服务很多用户,web-server 必须启动这个 C 程序的很多副本,因为一个副本可以同时服务很少的用户,大约 1-3 个用户。此外,每个用户都应该只使用他自己的副本,因此应该有很多 C 程序的副本。
这个 C 程序是一个CLIPS 引擎,如果它有助于理解的话。
所以,为了解决这个设计问题,我想写一个 Twisted TCP 服务器,它就像一个长时间运行的进程池。每个长时间运行的进程都是一个小型 Twisted TCP 服务器,它可以访问 C 程序的一个副本。
例如,用户要求池服务器为他保留一个长时间运行的进程,然后池服务器创建并运行一个开始监听某个端口的长时间运行的进程,然后池服务器返回主机并将这个长期运行的进程移植到用户。现在,用户可以直接与这个长时间运行的进程进行通信。
问题
- 如何从池服务器启动这些长时间运行的进程?池服务器和每个长时间运行的进程应该是单独的 Twisted 服务器。
- Twisted 是实现这些目标的好选择吗?
- 也许还有其他方法可以解决这个设计问题?
非常感谢。
objective-c - GCD 和 UIBackgroundTaskIdentifier
我有一个调度队列,其中有一些工作。当应用程序进入后台时,我希望队列继续运行,直到时间用完或队列耗尽。我将如何设置 UIBackgroundTaskIdentifier?
我需要像这样将它放入调度块吗?
我认为上面发生的事情是在队列实际运行块之前它没有注册为长时间运行的任务。那么我是否需要将代码的后台部分放在块之外,以便它在实际排队之前执行?
c# - Windows 服务是否需要数小时才能正常关闭?
我们有一个 .NET Windows 服务,它以事务方式将大量非常关键的数据从 A 铲到 B。我们还需要确保在服务中使用的所有外部组件都未正确分配,并且在关闭服务本身之前清理了所有内容。这可能需要几个小时!原因是服务需要等待外部组件的回调,该回调会在 2、3 或 4 小时后到达。
- Windows 是否有可能等待这么长时间才能正常关闭服务?
- 服务中是否有选项可以指示当服务被操作系统关闭时会发生什么,例如完全防止关闭?
- 另外,作为另一种情况,如果服务器需要重新启动会发生什么?它可以等待几个小时的服务吗?
- 操作系统在终止服务之前等待服务的时间是否有限制?
c# - 长时间运行的进程互锁
我正在创建一个 webservice+servicebus 项目,用户可以在其中执行类似的操作
此方法立即返回,但通过总线发送操作请求。
当另一个用户已经在运行时,当多个用户在同一个 aggregateId 上请求长进程时,我的问题就开始了。
我正在考虑的解决方案是一个连续运行的任务,并寻找一个Queue<LongProcessTask>
必须执行的操作,所以我一次只运行一个进程,或者如果不同的聚合 ID,未来的实现将是多个进程。
这样我就不会在同一个聚合上重叠长时间运行的进程。
其他想法?
.net - .NET 自动测试长时间运行的进程
我们想对需要将数据发送到外部源然后验证数据已正确显示在其网站上的流程进行一些自动化集成测试。
然而,数据出现在网站上可能需要几个小时。
传统 NUnit 或 MSTest 的问题是测试将等待数小时等待结果。
我见过可以用来并行运行所有测试的PNUnit,但它对我来说似乎不是一个优雅的解决方案。如果有 1000 个测试怎么办?这不会在服务器上创建大量进程/线程吗?以及如何跟踪所有这些。
那么有人解决了这个问题吗?您是否在家开发了解决方案,或者是否有针对此的开源解决方案?
c# - 客户端-服务器解决方案中等待用户交互的资源锁
我有一个客户端-服务器进程,在服务器端长时间运行(2-5 分钟)后,要求用户确认或更改操作结果。
用户可能需要一个小时或更长时间来检查服务完成的工作,进行更改并将其发送回服务。
在一个完美的世界中,没有人会更改服务用于构建操作结果的下划线源数据。但这不是一个完美的世界!
如何锁定以防止损坏我的源数据?我不想要 SQL 表锁定...我正在考虑一种软件机制,例如内存表,其中包含我的所有操作请求和一些互锁条件,以便进入可能损坏其他操作数据的等待状态操作。
还有其他提示吗?
编辑
有关该过程的更多信息可能是必要的..
我有一个带时间戳的实体,它代表电网拓扑的时间点。该实体包含所有未通电的元素的列表。
服务器进程在调用时必须获取所有尚未处理的实体,并为每个元素创建一个列表
基于一些业务规则,服务器进程聚合元素并等待用户确认或更改。
问题是实体加载后,真实网络会发生变化,表也会发生变化;同样在一个时间点内,更多的元素可以断电,因此服务器进程必须失效。如果用户 UI 已经在更改数据,我必须尽快提醒某些数据可能无效。
你会做什么?
unix - 解析长时间运行命令的连续输出
我找不到类似的问题,所以决定发布它
我有一个长期运行的工作(*nix 环境):
它运行了几天并以块的形式打印输出。我可以用一个脚本(可能是 Perl 吗?)代替“job.out”来修改分块输出(例如添加时间戳)并将其写入 job.out。