繁体   English   中英

如何创建一个长时间运行的任务来监听来自终端的请求? (不只是要求输入)

[英]How can I create a long running task that listens to requests from the terminal? (Not just asking for input)

我正在尝试一些新的东西,所以我没有词汇来用任何特定领域的语言表达我的问题。

我目前正在对我想要构建的工具进行思维导图。 该工具的 function 用于执行许多长时间运行的任务并将结果记录到远程数据库。 这与 Jenkins 构建和测试功能最相似。 不幸的是,我认为我不能使用 Jenkins,因为这些是在真实的实时自定义硬件上执行的测试,其中有很多 IO 操作与其他硬件资源。

它几乎肯定会在服务器上运行,所以它是无头的。 我通常构建带有 UI 的桌面工具,以在 windows 桌面环境中执行类似的任务。 当我想向用户传达该工具正在做什么时,我只需创建一些 UI 元素来显示状态。

在这种环境中,很少有人会看着它工作。 如果我确实需要在运行时调试某些东西,或者只是想检查状态,我立即想到的是日志文件。 但是,实时观看它们非常麻烦。

我希望能够以与git status相同的方式从命令行发出任务运行程序的请求。 我目前的想法是在 PATH 上注册我的命令(如 git)。 我可以让该命令连接到一个名为 pipe的长进程连接/监视并中继用户的请求。 (我以前从未使用过命名管道,但这似乎是让进程进行通信的标准方式?)

该解决方案需要三个“层”:

  1. PATH 上的命令可以解析/接受/拒绝用户的请求,然后将其转发。
  2. 监听用户请求并监控长任务执行的长进程管理器。
  3. 任务执行者自己。

还有其他方法吗? 我是在重新发明轮子吗? 非常感谢链接和资源!

如何创建一个长时间运行的任务来监听来自终端的请求? (不只是要求输入)

您可以使用sockets进行进程间通信或pipes

我是在重新发明轮子吗?

这取决于该程序的使用。 即正在运行的任务是什么。 例如:如果您正在创建版本控制系统,那么是的, git已经存在

如果没有,那就没有。 您只是在创建一个使用多线程的程序或应用程序或网站。 多线程由硬件(CPU)和操作系统提供。 您使用编程语言与这些线程交互。 应用程序或程序可以是单线程或多线程的。
例如 github:当您对答案进行投票时,您基本上是在创建一个请求,该请求由在服务器上运行的程序接收,该服务器创建一个线程来更新数据库中的投票计数。 同时,如果其他人也对答案进行投票,则可能由同一服务器在另一个线程上发送和处理类似的请求。 该服务器仍在侦听请求并同时执行任务(更新数据库中的投票计数)

注意:此示例已简化,仅作为示例

要在后台运行任务并仍然具有正常运行的 UI 或请求侦听器,您需要多个线程。 一个线程用于 UI,一个或多个线程用于处理请求,rest 用于运行这些后台任务并写入日志。

注意:在处理线程时,线程安全和线程间的共享资源很重要。
程序也可以使用多个进程,但引入多线程是为了解决使用多个进程的一些开销(与线程安全和共享资源有关)。

在您的情况下,如果日志文件在数据库中,则concurrency性访问由该数据库处理。
但是如果日志文件是系统上的本地文件,那么写入和读取日志需要处理对那个日志文件的多线程访问。
这就是使用线程安全和共享资源的地方。

请注意,以下是一个简化的比较:

对于使用多个进程的本地应用程序:

这个应用程序就像一个进程网络,每个进程运行一个特定的程序。

进程 1 可能会呈现 UI,进程 2 可能会写入日志文件,等等......

管道、信号或其他操作系统技术用于在这些进程(程序)之间发送消息和通信。
例如:当用户按下“写入日志”按钮时,进程 1 与进程 2 通信(使用上面的通信方法)以告知进程 2 写入该日志文件。



对于 web 应用程序:

进程成为通过网络连接的计算机(或在主机上运行的服务器)
操作系统技术成为网络通信,如 HTTP 请求和响应、JSON、xml 等......
所以
这个应用程序就像一个位于不同位置的计算机(服务器)网络,每台计算机都运行一个特定的程序。

计算机 1 可能会呈现 UI,计算机 2 可能会写入数据库,等等......

网络通信技术用于通过互联网在计算机或服务器之间进行通信。
例如:当用户按下“写入日志”按钮时,计算机 1 与计算机 2 通信(使用上述通信方法)以告知计算机写入该数据库。

主机是托管(运行)程序的计算机。 该程序通常称为服务器。 (主办方提供服务)

暂无
暂无

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

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