iT邦幫忙

0

請問 多工 和 非同步 是一樣的嬤?

大家好
想請問多工和非同步是一樣的嬤?
可能這樣問很攏統,還請大家包涵

結論:
我的想法設計跟實作是不相同的,但目的都是為了讓程式跑得更加快速

想法如下:

  1. 多工 在這邊我認為是 多執行緒
    -> 原則上是一個執行緒做一件事情
    -> 而多執行緒同時執行,便形成了多工
  2. 非同步
    -> 程式去做很多事情,但在做事情的時候,並不用等待事情全部完成後才回傳結果

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#的作法
但也希望知道會不會因為其他語言的特性不同,而有不一樣的概念或者想法呢?

如想法上有謬誤,但願能不吝指教

謝謝

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
8
YoChen
iT邦研究生 1 級 ‧ 2019-12-04 11:08:22
最佳解答

剛好最近才上完保哥的同步/非同步課程,這個問題我滿有感觸的~XDDD
先回答您結論
答案是: 不一樣

套用一句stackoverflow上我很喜歡的形容方式

Threading is about workers; Asynchrony is about tasks.

從上面的解釋來看他們的核心

  • 多執行緒(Multithreading):
    著重在使用多個工作者(Thread),它可以同時進行多個工作,但實際上的運作方式是並行還是平行,就看您CPU的能耐如何了
  • 非同步(Asynchronous):
    著重在有效的使用工作者(Thread),它可以讓有限的Threads盡可能的完成更多的工作

拿這個系列最喜歡提到的餐廳來舉例,
多執行緒(multithreading): 聘請多個廚師 註:但不一定有效率
非同步(Asynchronous): 讓一個廚師在同樣的時間內做最多的事情

提供您一個講解有關同步/非同步的文章,裡面就有提到多工非同步的差別
https://exceptionnotfound.net/async-await-in-asp-net-csharp-ultimate-guide/

多謝回覆
其中包含

Asynchronous programming doesn't improve performance, it improves throughput.
Threading is about workers; asynchrony is about tasks.
您提供的答案和其中的連結受益良多 非常感謝

1
阿展展展
iT邦好手 1 級 ‧ 2019-12-03 16:14:33

這在各個程式語言都有不同的解釋
你會問這樣的問題是要針對同時間多 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

會想這知道這方面的知識
是因為想釐清原理跟想法
感謝您的回覆

2
小魚
iT邦大師 1 級 ‧ 2019-12-03 19:54:40

既然你提到了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等的需要委派主執行緒動作,
否則會出現錯誤.
能否告知更多的細節,或者查詢的方向呢?
謝謝

小魚 iT邦大師 1 級 ‧ 2019-12-05 10:17:58 檢舉

只要是要動到UI,
就一定要在主執行緒上面執行,
所以"持續"回寫UI的動作是一定會產生延遲的.
另外所謂的非同步應該也是在同一個執行緒上執行,
如果是在主執行緒上運行,
有可能會造成UI的延遲.

了解,謝謝您的回答

6

依照你的題目來回答。
這兩者是不一樣的

要說明的話。我用貨運公司來說明好了。

一般所謂的單工,就是車出去了。要等到它回來後。才能點算結果。再跑下一單。
這就是單工的情況。

而非同步。就是我一台車出去了,只要我的貨運中心還有車,我就可以再繼續下另一台車出去。
每台車回來的時間不一樣。就分別處理結果。

多工的話,就是貨運中心有其不同的出車窗口。其是各別分配工作處理。

/images/emoticon/emoticon12.gif

覺得你的解釋很清楚易懂
細節的部份我想也可以看一下 YoChen貼的
謝謝您的回覆

GHH iT邦新手 1 級 ‧ 2019-12-04 15:42:32 檢舉

解釋簡單明瞭給推

我要發表回答

立即登入回答