我們有一個Web應用程序,可以監視像twitter/facebook這樣的幾個社交媒體。我們從這些社交媒體收到的數據將被保存到數據庫中。數據很大,因此我考慮使用Task
來將數據保存到數據庫中。並行性,幾千條線程
但我對它是如何工作有一些擔憂。在文檔中找不到如果我爲1個用戶乘以2000用戶啓動10個線程會發生什麼情況?或者可能有10,000個用戶。
究竟會Task
嗎?它是否有這種Threads
排隊?
任何關於此事的信息都會非常感激。謝謝!
我們有一個Web應用程序,可以監視像twitter/facebook這樣的幾個社交媒體。我們從這些社交媒體收到的數據將被保存到數據庫中。數據很大,因此我考慮使用Task
來將數據保存到數據庫中。並行性,幾千條線程
但我對它是如何工作有一些擔憂。在文檔中找不到如果我爲1個用戶乘以2000用戶啓動10個線程會發生什麼情況?或者可能有10,000個用戶。
究竟會Task
嗎?它是否有這種Threads
排隊?
任何關於此事的信息都會非常感激。謝謝!
一個Task
只是周圍可以被調度到TaskScheduler
的隊列委託的包裝。 Task
不會創建任何線程。當您在內部呼叫task.Start()
時,它會調用taskScheduler.QueueTask(Task)
方法。
默認情況下,所有任務使用的內部使用ThreadPool
的TaskScheduler.Default
。 您可以在創建TaskFactory
時指定自定義任務計劃程序 - 此類具有接受TaskScheduler
參數的構造函數。當前的調度程序始終可通過TaskScheduler.Current
屬性獲取。
一個Task
使用Thread
做的工作。
Tasks
被排隊到ThreadPool
。
要回答你的問題;你需要嘗試一下,看看應用程序是否應對。
你也許可以分享線程所以它不會是10個* 2000多個線程。
您應該使用異步編程模型(APM)來執行此操作。
通過使用APM,您可以避免創建數百個線程。
幕後的APM可以使用I/O Completion Ports
來提供數據到達或發送時的回調,這意味着線程不必被浪費。
看到這裏的一些細節:
http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx
http://msdn.microsoft.com/en-us/library/vstudio/hh300224.aspx
見http://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread –
你需要1000個內核運行1000個線程。除了服務器上的內核數量之外,可能會降低系統速度,而不是加快速度。 – SWeko
@Sekeko:這是不正確的。我有1650個線程在我的機器上運行,而我(可惜)CPU上沒有1650個內核。請記住,線程可以做比計算更多的事情;他們可以等待IO或網絡,只是睡覺,直到他們需要,等等。這就是說,創建10K工作線程很可能是一個愚蠢的想法和線程池功能更好。 – Joey