作爲一個副項目,我正在編寫一個我曾經玩過的古老遊戲的服務器。我試圖讓服務器儘可能鬆散耦合,但是我想知道什麼是多線程優秀的設計決策。目前,我有行動的順序如下:許多線程或儘可能少的線程?
- 啓動(創建) - >
- 服務器(偵聽客戶,創建) - >
- 客戶端(監聽命令併發送週期數據)
我假設平均有100個客戶,因爲這是遊戲任何時間的最大值。對於整個線程的線程,什麼是正確的決定?我目前的設置如下:監聽新的連接,新的連接創建一個客戶端對象,並再次啓動監聽服務器上
- 1個線程。
- 客戶端對象有一個線程,偵聽傳入的命令併發送週期性數據。這是通過使用非阻塞套接字完成的,因此它只是檢查是否有數據可用,處理該數據,然後發送已排隊的消息。在發送 - 接收週期開始之前完成登錄。
- 遊戲本身的一個線程(現在),因爲我認爲從整個客戶端 - 服務器部分分離,從架構上講。
這將導致總共102個線程。我甚至考慮給客戶端2個線程,一個用於發送,另一個用於接收。如果我這樣做,我可以在接收器線程上使用阻塞I/O,這意味着線程在平均情況下將大部分空閒。
我主要關心的是,通過使用這麼多線程,我會佔用資源。我不擔心競賽狀況或僵局,因爲這是我必須處理的事情。
我的設計的設置方式是我的可能使用一個單線程的所有客戶端通信,無論它是1還是100.我已經將通信邏輯從客戶端對象本身分開,所以我可以在不必重寫大量代碼的情況下實現它。
主要問題是:在應用程序中使用200多個線程是錯誤的嗎?它有優勢嗎?我正在考慮在多核機器上運行它,它是否需要像這樣的多核心的很多優勢?
謝謝!
在所有這些線程中,大多數線程通常都會被阻塞。我不希望連接超過每分鐘5次。來自客戶的命令很少出現,平均每分鐘20次。
按照我在這裏得到的答案來回答(上下文切換是我正在考慮的性能打擊,但直到您指出它時我才知道,謝謝!)我想我會去的方式有一個監聽器,一個接收器,一個發送器,以及其他一些東西;-)
廢話,睡眠線程有一個1MB的堆棧,所以200個睡眠線程是200MB浪費的內存。 – 2008-12-17 18:21:33
在一臺能夠管理遊戲中100個客戶端的服務器中,200MB的浪費空間幾乎就在那裏。 – 2008-12-17 18:37:19