大家好
想請問多工和非同步是一樣的嬤?
可能這樣問很攏統,還請大家包涵
結論:
我的想法設計跟實作是不相同的,但目的都是為了讓程式跑得更加快速
想法如下:
A task is something you want done.
A thread is one of the many possible workers which performs that task.
這邊附上我認為比較容易理解的網址提供參考
參考:
1.https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/concepts/async/
2.https://stackoverflow.com/questions/4130194/what-is-the-difference-between-task-and-thread
這邊主要討論C#的作法
但也希望知道會不會因為其他語言的特性不同,而有不一樣的概念或者想法呢?
如想法上有謬誤,但願能不吝指教
謝謝
剛好最近才上完保哥的同步/非同步課程,這個問題我滿有感觸的~XDDD
先回答您結論
答案是: 不一樣
套用一句stackoverflow上我很喜歡的形容方式
Threading is about workers; Asynchrony is about tasks.
從上面的解釋來看他們的核心
使用多個工作者(Thread)
,它可以同時進行多個工作,但實際上的運作方式是並行還是平行,就看您CPU的能耐如何了有效的使用工作者(Thread)
,它可以讓有限的Threads盡可能的完成更多的工作拿這個系列最喜歡提到的餐廳來舉例,多執行緒(multithreading)
: 聘請多個廚師 註:但不一定有效率非同步(Asynchronous)
: 讓一個廚師在同樣的時間內做最多的事情
提供您一個講解有關同步/非同步的文章,裡面就有提到多工
跟非同步
的差別
https://exceptionnotfound.net/async-await-in-asp-net-csharp-ultimate-guide/
這在各個程式語言都有不同的解釋
我猜你會問這樣的問題是要針對同時間多 request 時的處理
這要看更詳細的情境才有辦法解
就文件來說...
C# 與死結 (Deadlock)
http://ccckmit.wikidot.com/cs-deadlock
C# 學習筆記:多執行緒 (2) - 分道揚鑣
https://www.huanlintalk.com/2013/05/csharp-notes-multithreading-2.html
另外是...go的作法
從 PHP 重構為 Golang 經驗談
https://ithelp.ithome.com.tw/articles/10209506
希望有幫到你QQ
既然你提到了C#,
那範圍就小很多了,
我先定義一下,
你所謂的非同步是 BeinInvoke ?
多工是多執行緒 Thread ?
如果是這樣子的話,
基本上BeginInvoke還是在同一個執行緒,
只是等到有空才去做事.
如果是多執行緒就會在另外一個執行緒動作,
但是如果你要動到UI等的需要委派主執行緒動作,
否則會出現錯誤.
如果只是計算或是跟其他動作獨立運作的,
就讓他自己跑就好了.
不知道這樣的回答有沒有回答到你的問題?
您好, 因為我還沒寫過BeginInvolke
參考這篇https://stackoverflow.com/a/229558/10477064
知道他也是非同步寫法
有個地方想問
程式執行流程
->用非同步地起了一個Thread執行其他程式
->再撈取另外一個程式中的log(需要持續時間)
->最後回寫到自己的UI上可能會造成UI的FROZEN嗎?(持續回寫,直到結束)
在我的認知上,我認為非同步理論上,是不會造成原本的UI有FROZEN的情形
所以用一個新的Thread去執行另一個程式,應該是合理的
而且在撈取該程式的Log是使用非同步,應該也是在預估之內
其中我比較不確定的是在"持續"回寫UI上,到底有沒有可能造成FROZEN
因為還不是肯定答案
而Google了一下,寫非同步還是可能造成UI的FROZEN
只是寫法上需要修正
這是我找到類似的討論
https://stackoverflow.com/questions/35724024/using-async-await-still-freezes-gui
而您提到
但是如果你要動到UI等的需要委派主執行緒動作,
否則會出現錯誤.
能否告知更多的細節,或者查詢的方向呢?
謝謝
只要是要動到UI,
就一定要在主執行緒上面執行,
所以"持續"回寫UI的動作是一定會產生延遲的.
另外所謂的非同步應該也是在同一個執行緒上執行,
如果是在主執行緒上運行,
有可能會造成UI的延遲.
了解,謝謝您的回答
依照你的題目來回答。
這兩者是不一樣的
要說明的話。我用貨運公司來說明好了。
一般所謂的單工,就是車出去了。要等到它回來後。才能點算結果。再跑下一單。
這就是單工的情況。
而非同步。就是我一台車出去了,只要我的貨運中心還有車,我就可以再繼續下另一台車出去。
每台車回來的時間不一樣。就分別處理結果。
多工的話,就是貨運中心有其不同的出車窗口。其是各別分配工作處理。