C 深度學習 Task(基於任務的非同步模型)

2022-03-26 04:15:04 字數 3009 閱讀 4829

一、task關鍵字解釋

task 類的表示的單個操作不會返回乙個值,通常以非同步方式執行。 task 物件是一種的中心思想 基於任務的非同步程式設計模式 首次引入.net framework 4 中。 因為由執行工作 task 物件通常上非同步執行乙個執行緒池執行緒而不是以同步方式在主應用程式執行緒中,您可以使用 status 屬性,以及 iscanceled, , iscompleted, ,和 isfaulted 屬性,以此來確定任務的狀態。 大多數情況下,lambda 表示式用於指定的任務是執行的工作。可以說在某種程度上類似於執行緒池,但比執行緒池更容易使用。

需要用到的程式集

mscorlib(在 mscorlib.dll 中)

system.threading.tasks(在 system.threading.tasks.dll 中) 

二、task和threadpool

task是在threadpool的基礎上推出的,threadpool中有若干數量的執行緒,如果有任務需要處理時,會從執行緒池中獲取乙個空閒的執行緒來執行任務,任務執行完畢後執行緒不會銷毀,而是被執行緒池**以供後續任務使用。當執行緒池中所有的執行緒都在忙碌時,又有新任務要處理時,執行緒池才會新建乙個執行緒來處理該任務,如果執行緒數量達到設定的最大值,任務會排隊,等待其他任務釋放執行緒後再執行。執行緒池能減少執行緒的建立,節省開銷。

看下面**

class

program

個執行任務");

}), i);

}console.readkey();}}

}

結果是:

相對於thread優勢:

1、**簡單

2、減少不必要的建立,降低開銷

自身缺點:

threadpool不能控制線程的執行順序,我們也不能獲取執行緒池內執行緒取消/異常/完成的通知,即我們不能有效監控和控制線程池中的執行緒。

三、task的使用

1、類廠呼叫

task t=  task.factory.startnew(() =>

});t.wait();

for (int i = 0; i < 10; i++)

一般的,如果我們不需要得到lambda的返回值,也不需要控制它和主線程中的執行緒關係,只要求它和主線程同時高效執行task.factory.startnew就好,如果需要阻塞主線程,則需要給任務乙個引用t,並在需要的地方呼叫阻塞方法wait,waitall是針對任務鏈

2、task的建構函式初始化 (可以新增第二個引數附加資訊)

需要呼叫task,開始執行任務

task t=  new task(() =>

});t.start();

for (int i = 0; i < 10; i++)

t.wait();

3、run

task t=  task.run(() =>

});for (int i = 0; i < 10; i++)

t.wait();

四、同步執行

task提供了 task.runsynchronously()用於同步執行task任務

task t=  new task(() =>

});t.runsynchronously();

for (int i = 0; i < 10; i++)

t.wait();

五、有返回值

func func = ()=>;

task

t= new task(func);

t.start();

for (int i = 0; i < 10; i++)

t.wait();

console.writeline(t.result);

呼叫t.result的時候,呼叫執行緒會阻塞

六、task任務的阻塞(wait/waitall/waitany)

thread的join方法可以阻塞呼叫執行緒,但是有一些弊端:①如果我們要實現很多執行緒的阻塞時,每個執行緒都要呼叫一次join方法;②如果我們想讓所有的執行緒執行完畢(或者任一線程執行完畢)時,立即解除阻塞,使用join方法不容易實現。task提供了 wait/waitany/waitall  方法,可以更方便地控制線程阻塞。

task.wait()  表示等待task執行完畢,功能類似於thead.join();  task.waitall(task tasks)  表示只有所有的task都執行完成了再解除阻塞; task.waitany(task tasks) 表示只要有乙個task執行完畢就解除阻塞 

如果將栗子中的waitall換成waitany,那麼任一task執行完畢就會解除執行緒阻塞,執行結果是:先列印【執行緒1執行完畢】,然後列印【主線程執行完畢】,最後列印【執行緒2執行完畢】

七、task任務的取消

1 thread取消任務執行

在task前我們執行任務採用的是thread,thread如何取消任務,可以建立乙個key

static void main(string args)

});t.start();

//五秒後取消任務執行

thread.sleep(5000);

key= true;

console.readkey();

}

task中有乙個專門的類 cancellationtokensource  來取消任務執行,還是使用上邊的例子,我們修改**如下,程式執行的效果不變。

static void main(string args)

});task.start();

//五秒後取消任務執行

thread.sleep(5000);

方法請求取消任務,iscancellationrequested會變成true

source.cancel();

console.readkey();

}

有疑問**qq群:568055323

Task4基於深度學習的文字分類

fasttext是一種典型dl詞向量的表示方法,它通過embedding層將單詞對映到稠密空間,然後將句子中所有的單詞在embedding空間中進行平均,進而完成分類操作 它是乙個三層神經網路 輸入層 隱含層 輸出層 它用單詞的embedding疊加獲得的文件向量,將相似的句子分為一類 它學到的em...

基於C 的Caffe(一)深度學習

為了讓機器自動學習,需要為機器準備三份資料 1.訓練集,機器學習的樣例 2.驗證集,機器學習階段,用於評估得分和損失是否達到預期要求 3.測試集,機器學習結束之後,實戰階段評估得分。深度學習 deep learning,dl 是由多個處理層組成的計算模型,可以通過學習獲得資料的多抽象層表示。推 像搜...

新聞文字分類 Task6 基於深度學習的文字分類3

學習目標 將有限的注意力集中在重要的資訊上,從而節省資源,快速獲取最有效的資訊。這就是簡單的attention is all you need。個人理解 有個圖書館 source 裡面有很多的書籍,為了方便管理我們給他們做了標籤,形成 標籤,書籍 k,v 這種方式,當我們需要了解某個資訊,比如北京大...