2017-04-11 78 views
0

最近我已經瞭解了網絡編程。我知道,對於服務器來處理多個客戶端,有需要使用selectThread(至少在python/c/C++中,我不知道什麼關於在java中類似於select的東西,在java中我只知道線程方法)。套接字 - 選擇/線程/都

我讀過使用select從性能角度來看更好,線程對於小型服務器更好。然而,昨天我發現這個頁面:http://www.assembleforce.com/2012-08/how-to-write-a-multi-threading-server-in-python.h,我不明白爲什麼在提供的代碼人使用selectthreads?我很難理解它究竟是如何工作的,爲什麼它比我提到的其他方法更好?我不明白這個代碼背後的想法。

謝謝。

+0

如何使用串行總線RabbitMQ MuleSoft。讓串行總線爲你做好工作。讓您的應用程序線程安全可能相當複雜,通常讓OS更好地爲您處理。可能不會回答問題,但這些是不同的出路,適用於Web開發。 –

回答

1

線程和select不是互斥的。

多線程是並行處理的一種形式,允許單個進程看似以異步方式執行多個任務。

使用select允許您的程序監視文件描述符(例如套接字),等待事件。

都可以(並且據我所知,經常)一起使用。在網絡服務器環境中,可以使用線程來爲多個客戶端提供服務,而使用select以使其中一個線程在處理時不佔用CPU時間。

想象一下,您正在接收來自多個客戶端的數據。一個線程正在等待來自client1的數據,這需要很長時間,同時client2正在瘋狂地發送數據。您有三個選項:

  1. 沒有select,使用阻塞調用:阻止來自client1的等待數據,並且讓client2等待。
  2. select,使用非阻塞調用:連續輪詢client1,放棄n嘗試沒有任何數據傳輸。
  3. With select:監控客戶端套接字。如果他們有數據要傳輸,請閱讀它。否則,請重新確定當前的線程CPU時間。

這是一種簡單的非阻塞網絡服務器方法,試圖給客戶端提供低延遲響應。有不同的方法,爲此,我建議您檢查UNIX網絡編程書。

+0

使用你的建議,我試圖用線程和select來實現一個服務器。但似乎有些事情仍然是錯誤的。能否請你幫忙? http://stackoverflow.com/questions/43355800/select-thread-multiclient-server-in-python-hangs-after-receiving-after-first-m –