「QT不適合開發高並發的網路應用」 是真的嗎?如果不是,應該如何設計;如果是,應該如何化解?

經常有人說QT不適合開發高並發的網路應用,因為它自帶的網路庫性能太差。請問是真的嗎?那麼類似QQ,YY這樣高並發的網路應用,使用QT開發應該如何設計?


這個說法不恰當,第一次聽過客戶端開發套件要考慮網路高並發的說法,高並發只會指後端業務,比如你一台物理伺服器需要承載個2萬,3萬用戶的時候考慮的事情。桌面客戶端軟體,象YY/QQ這種,同時需要管理的連接數不會超過100條,網路傳輸數據每秒不會超過1000個數據包,根本不是一個量級,桌面客戶端軟體還談不上高並發網路吧。

再Qt里那麼多組建給你用,又不是強制你全部都用它的,你也可以網路部分用別的,界面和其他基礎容器用QT自己的啊。

----

根據評論更新:如果要做伺服器,並且Qt 套個GUI控制伺服器的話,最佳實踐如下:

1. 核心服務端做成命令行的,監聽兩個埠,一個用戶埠,一個管理埠(telnet or http)

2. 命令行版本的伺服器可以由 GUI伺服器啟動,也可以放在 Windows Service 下面自動啟動

3. GUI通過本地管理埠和核心伺服器跨進程交互

這樣你的核心服務進程可以用各種跨平台高性能的網路框架實現,徹底不要管UI,哪天移植到 linux 下,可以掛在 supervisord 下面自動啟動,多好。

管理埠可以支持成 telnet / http 協議,初期開發調試方便。telnet 協議的好處是簡單直觀,對命令行友好;http 協議的好處是,IE就能調試了,而且後面你可以把控制端用 web實現,不必Qt

你其實是要做兩件事情:實現一個服務進程,再用Qt實現一套管理GUI給人用,哪天移植到別的操作系統的話,做個命令行版本的控制工具就行了。

對吧?別攪在一起,分開不同的人開發,省事請,出問題好找,GUI崩潰了也不會牽連到你的服務進程,到時候好定位,你可以告訴寫GUI的,看我telnet了沒問題。


謝邀。

首先,正如其他答主提到的,客戶端的網路並發並不高,所以無論用哪個網路庫都夠用的。

但是,Qt的Network庫的確性能不好。

Qt Network的好處是封裝好了高度抽象的各類網路api,從服務端到客戶端,涵蓋tcp udp http ssl websocket等,開發應用程序時很不錯,但不適合用來做伺服器後端網路庫。

以tcp udp為例,據我所知,它們在wibdows上的實現是select而非iocp,linux上的實現也不是epoll,再加上抽象層次太多,所以高並發性能並不好。

據某些技術博客里的案例,QTcpServer只能支持大約1000個並發連接。

所以在高並發場景下,我建議用別的網路庫。如果覺得qt api好用,可以嘗試把別的網路庫封裝為qt api,如@渡世白玉 的QAsioSocket(吐槽一句,這套封裝只是api長得像QAbstractSocket,但並沒繼承自QAbstractSocket……)


QT不適合做流量大的伺服器端,注意是伺服器端,不是客戶端。

這年頭控制台一般都用H5做,不需要一個程序集成所有功能。


每一種武器都有適用場合,qt開發網路應用對付普通千人連接伺服器沒問題,至少比java的點net原生庫快,對於高並發,和高並發秒殺高並發聊天,建議用其他方案,非互聯網高並發級應用沒有問題。

非遊戲聊天類,現在多用web取代socket開發,如websocket,微服務,json api,節省時間,容易水平擴展。如果內網幾百人用,如網吧企業管理系統,用qt做伺服器沒問題,不是人人都在造航母,適合高性價比是關鍵。


Qt不是個GUI框架嗎,高並發什麼時候是它的需求了。


qt的socket對操作系統原生的socket做了一層不算很厚的封裝,並發問題上qt的eventloop在linux上也是採用了poll這種操作系統提供的事件介面,並不是while死循環。。。。所以你能用原生socket能寫出來高並發的網路應用,那麼用qt的socket寫應該不會造成太大數量級的差異,當然具體要去看qt的源碼,我也是粗略看了一下,發表一點薄見。另外伺服器也分好多種,真正需要大並發需求的伺服器可能占所有伺服器程序設計的分量也不見得大,常見的可能是區域網多台機互聯,自定義應用層協議這樣的需求,對於這樣的需求使用qt的tcpServer我覺得是綽綽有餘的。我曾經設計過幾百台醫療設備分不同網段的區域網互聯,監控設備就是採用qt的tcpServer,同時幾百個並發也是毫無壓力的,再多的我也沒試過,不過我想你做個普通的網站,如果能有同時幾百個用戶訪問也應該是中等規模的生意了吧。超大並發需求,如果硬要用qt,建議研究qt源碼,加以改造或許也是能行的。


客戶端的並發需求並不高,Qt的網路庫未來可能會越來越好,因為Qt是一款商業軟體,有專人維護。未來用Qt實現伺服器其實是一件可以預期的事情。畢竟這種技術越來越成熟。


客戶端在什麼場景需要高並發呢?


這個問題好奇怪,gui套件和高並發的服務端並不衝突啊,各干各的,gui最多提供一個界面,與後端服務進程分離就行。而且,用web界面不是更流行?


Qt本來就不是用作大規模並發開發用的,雖說各類庫很齊全,但是主要方向是跨平台GUI跨平台GUI啊喂


用其它跨平台庫就好了啊,ACE,UDT,都可以


qt自帶的網路庫性能是要差些,所以你可以用別的,比如asio


推薦閱讀:

為什麼有些大公司技術弱爆了?

TAG:軟體架構 | QtC開發框架 | 高並發 |