2011-06-08 27 views
0

我在python中編寫一個服務器,需要從客戶端獲取請求,排隊請求,一次執行一個請求,然後告訴客戶端他們的特定請求已被處理。編寫一個排隊任務的服務器

目前我接觸到它的方式是使用TCP套接字服務器 - 但是,我不知道如何使它只有一個請求正在從隊列中執行一次?

我想爲它的樣子:

Client1 -> (a) -> Server 
Client2 -> (b) -> Server 
Client3 -> (c) -> Server 

Server makes queue |a, b, c| 
Execute a first. Done? Tell Client 1 
Execute b second. Done? Tell Client 2 
Execute c third. Done? Tell Client 3 

據我瞭解,如果我的recv客戶端的請求的服務器,執行它,並作出迴應,這可能在同一時間發生不同的線程。我只希望一個線程執行所有任務(因爲我預計會有很多任務進入,如果每個人同時運行一個任務,它會很慢)。我如何實現這一目標?

+0

困惑?你有一臺服務器從Q讀取?爲什麼會有多個任務同時進行? – Nix 2011-06-08 17:48:03

+0

我沒有隊列,我不知道如何實現它,以便服務器以上述方式運行。目前它每次創建一個新的連接時都會產生一個新的線程,與我所瞭解的情況相同。我希望單個腳本將任務排隊,線性執行它們,然後通知完成任務的客戶端。我不知道如何做到這一點。 – 2011-06-08 17:52:01

+0

這些是長時間運行的任務嗎? – Nix 2011-06-08 18:13:07

回答

0

好了,所以什麼尼克斯說的是對的,但我不知道如何使恰好發生(我的問題是如何去實際上是這樣)

事實證明,我必須啓動2個線程:一個從隊列中執行,另一個是主服務器處理程序。服務器處理程序會爲每個新連接生成線程,並且在發送請求/如果請求成功排隊後客戶端塊會被阻塞。這意味着隊列需要通過信號量或互斥體進行線程安全/保護。在python的情況下,有一個multiprocessing.Queue類爲你處理。每當一個任務執行時,執行線程會執行一個notifyAll(),它會導致所有睡眠線程喚醒並檢查他們所請求的任務是否完成。我爲此使用了一個條件變量。

3

有噸的方式剝皮,而是一個解決方案是要看起來像下面:

客戶端 - >客戶中保(TCP端口)< - >服務器中保 - >(ServerQ) < - 任務處理

的流動會是這樣的:

客戶端進程:

  1. 客戶端創建一個TCP套接字客戶端調停。
  2. 通過端口發送它需要的任何信息。
  3. 服務器中保接收該請求
    1. 創建用於任務處理的響應Q
    2. 地方上的服務器Q中的請求(命令+ RESPONSEQ)
  4. 等待上RESPONSEQ
    1. 響應X時間超時後沒有響應?
    2. 一旦有響應,讀取並通過tcp端口發送響應。

服務器進程:

  1. 從服務器Q.讀取
    1. 進程的命令
    2. 寫入響應Q
響應210

涉及的組件

客戶端 - 發送完成任務請求的簡單流程。

Client-Mediator - 創建到服務器進程的連接。

Server-Mediator - 接受客戶端任務處理請求,排隊任務並等待響應。

任務處理 - 從ServerQ讀取並等待任務進來