2013-11-23 40 views
0

異步操作似乎必須在不同的線程中執行。也就是說,如果不涉及多線程,就不能創建異步操作。畢竟,如果它不在另一個線程中執行,它會阻塞主線程,因此它不再是異步的。異步計算總是必須使用單獨的線程?

但是,他們告訴我,異步並不一定意味着涉及額外的線程。如果我記得正確,他們告訴它至少對於JavaScript來說是正確的。

所以我的問題是:異步操作是否必須在不同的(不是主)線程中執行總是並且可以在沒有多線程的情況下存在異步計算?

+0

線程允許異步計算,因爲OS調度它們,但其他調度機制也是可能的。例如,Go使用goroutine,這是輕量級的「線程」(儘管不在OS意義上),即運行時運行時間同時進行調度。 – Alec

回答

3

您還沒有真正在這裏指定語言/技術。

異步傳統意味着它獨立於「時鐘」運行同義詞是「基於事件」 - 異步意味着事件被觸發。同步是正常的代碼流,就像依次讀取一行一行一樣。

異步函數可以發生在任何線程中,你似乎比較蘋果和橙子。

想象一個分支來監視中斷的線程,如果發生中斷,監視線程將被異步使用。這是一個奇怪的問題,但答案是「不,異步活動可以發生在任何線程」

是的,它可以存在沒有多線程。

+0

如果代碼一行一行地執行,它如何在沒有多線程的情況下存在? –

+0

查看「事件循環」 - 基本上,您的代碼可以處於「偵聽」狀態,當發生事件/中斷時,它可以執行代碼。所有單線程。 – FaddishWorm

1

您可以擁有一個操作系統線程,但可以使用多個綠色線程(在用戶空間中管理的線程)執行異步操作。與此相關的一個上下文是IO綁定應用程序,例如Web應用程序打擊數據庫。一般來說,這是由連接到數據庫的網絡綁定的IO。

假設我們只有一個控制線程。如果請求是同步發生的,那麼一次只發生一個請求,因爲我們在轉移到下一個請求之前等待套接字向我們返回數據包。現在你可以意識到大部分時間都花在了回覆上,所以把這個工人放在一個「等待隊列」(使用select或epoll或你有什麼),並讓別人得到處理和等待。

負責這樣做的人是調度程序或事件循環(參見綠色線程以及輕量級但在用戶空間而不是由內核管理)。所以我們的想法是編寫一個調度程序,將時間分配給一個線程本身。

也許你對python或node js很熟悉?一些像龍捲風和扭曲的web框架利用了一個可以通過「事件循環」切換的單個線程:請參閱:http://krondo.com/?p=1209

1

異步性和多線程是不同的概念,雖然經常混淆。爲了支持異步性,一個線程就足夠了,它可以成爲主線程,但切換到異步模式。多線程的異步性是可能的,但更復雜且容易出錯。因此,典型的決定是爲異步性分配一個單獨的線程,就像在所有GUI框架中完成的那樣,包括swing/awt。

0

這取決於需求,但最好是爲異步計算分離線程。 E.g在http應用程序中,如果主線程正在等待其他服務器的響應,並且在接收到響應後不做任何事情,最好爲此啓動一個新線程,讓主線程完成它的工作並釋放所有獲取的資源通過它。它會提高性能並減少堆的使用量。