簡體   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