最近看了一點isolate的東西, 自己寫了乙個例子.
普通的的 consummer-producer例子是只有前後兩端的,實際上,會把前後兩端再進行包裝.
我這裡這個例子,是把這個層級擴充,變成4層.
graph lr
a((消費者))--定單--> b((小商店))--定單-->c((批發商))--定單-->d((加工廠))
d--運送-->c--運送-->b--運送-->a
消費者 consummer 是乙個future,傳送請求,等待回覆, 不關心中間過程.
小商店 seller 是主線程的處理函式,響應consummer的請求,並把請求傳送給次執行緒的處理函式,
批發商 wholesale 是次執行緒的任務分發函式,可以把任務按同步的方式分發,也可以按非同步的方式分發,我的例子是非同步方式.
加工廠 producer 是執行任務的api, future. 在次執行緒執行.
同時,也要定義好前後通訊的資訊的格式.
dart**,flutter中的**就不放了.
import 'dart:isolate';
typedef futureapirets = futurefunction(apiargs args);
//api的引數的形式
class apiargs
}.tostring();
}}//api的返回值的形式
class apirets
}.tostring();
}}//seller 到 wholesale 的訊息的格式
class msg) : sendport = receiveport.sendport;
}//封裝 seller,wholesale 到乙個類裡,同時把執行緒的初始化和結束功能寫出來.
class isolatetest ) async ");
var rec = receiveport();
//與wholescale通過sendport通訊
isolatetest.sendport.send(msg(msg, rec, apiname: apiname, apiargs: args));
print("seller wait===:msg->$");
k ret = (await rec.first) as k;
print("seller end----:msg->$");
return ret;
} //wholesale功能,執行在次執行緒裡
static future wholesale(msg message) async :count->$count");
count++;
var ret;
//根據api的名稱來呼叫
if (msg.apiname != "")
} catch (e)
return ret;
};s().then((value) :count->$count");
reply.send(value);
});} else :count->$count");
reply.send(ret);}}
print('wholesale over');
} //建立次執行緒
static future createisolate() async
} //結束次執行緒
static closeisolate()
}}//次執行緒內,執行具體任務的api,封裝在乙個類裡,
class apitest ;
} string name;
mapapimap;
//apis
futureapia(apiargs args) async ],args:$");
await future.delayed(duration(seconds: 3));
apirets ret = apirets(["apia"], {});
print("producer apia---:name:[$],args:$");
return ret;
} futureapib(apiargs args) async ],args:$");
await future.delayed(duration(seconds: 4));
apirets ret = apirets(["apib"], {});
print("producer apib---:name:[$],args:$");
return ret;
} futureapic(apiargs args) async ],args:$");
await future.delayed(duration(seconds: 5));
apirets ret = apirets(["apic"], {});
print("producer apic---:name:[$],args:$");
return ret;
}}//使用者的呼叫測試
future consumer(int count, string name, string apiname) async );
print('consumer start++:$name,$count,$');
apirets ret = await isolatetest.seller(name, apiname: apiname, args: args);
print('consumer end----:$name,$count,$');
}main(listargs) async );
}
create isolate start
wholesale start
wholesale waiting
create isolate finish
consumer start++:aaa,1,}}
seller start++:msg->aaa
seller wait===:msg->aaa
consumer start++:aaa,2,}}
seller start++:msg->aaa
seller wait===:msg->aaa
consumer start++:aaa,3,}}
seller start++:msg->aaa
seller wait===:msg->aaa
consumer start++:bbb,4,}}
seller start++:msg->bbb
seller wait===:msg->bbb
wholesale start++:msg->aaa:count->0
producer apia+++:name:,args:}}
wholesale start++:msg->aaa:count->1
producer apib+++:name:,args:}}
wholesale start++:msg->aaa:count->2
producer apic+++:name:,args:}}
wholesale start++:msg->bbb:count->3
producer apia+++:name:,args:}}
producer apia---:name:,args:}}
wholesale end----:msg->aaa:count->4
seller end----:msg->aaa
consumer end----:aaa,1,}}
producer apia---:name:,args:}}
wholesale end----:msg->bbb:count->4
seller end----:msg->bbb
consumer end----:bbb,4,}}
consumer start++:ccc,5,}}
seller start++:msg->ccc
seller wait===:msg->cccwholesale start++:msg->ccc:count->4
wholesale end----:msg->ccc:count->5
seller end----:msg->ccc
consumer end----:ccc,5,null
producer apib---:name:,args:}}
wholesale end----:msg->aaa:count->5
seller end----:msg->aaa
consumer end----:aaa,2,}}
producer apic---:name:,args:}}
wholesale end----:msg->aaa:count->5
seller end----:msg->aaa
consumer end----:aaa,3,}}
close isolate
注意到中間 有部分的顯示有問題.
seller start++:msg->ccc
seller wait===:msg->cccwholesale start++:msg->ccc:count->4
wholesale end----:msg->ccc:count->5
這裡, 我分析是主次執行緒同時呼叫print()的時候,產生的亂碼.
Flutter中主題風格
flutter中主題風格可通過theme主題,那麼應用程式中的某些widget,就會直接使用主題的樣式。一 全域性theme theme themedata 1.亮度 brightness brightness.light,2.primaryswatch傳入不是color,而是materialcol...
Flutter學習 初識 Flutter
需要注意的資料夾 資料夾用途 android android 平台相關 iosios 平台相關 libflutter 相關 存放原始碼的地方 test 用於存放測試 pubspec.yaml 配置檔案,一般存放一些第三方庫 也可以簡寫 scaffold 是 material design 布局結構的...
Flutter中Widget與Element關係
widget widget 是 flutter 世界裡對檢視的一種結構化描述,你可以把它看作是前端中的 控制項 或 元件 widget 是控制項實現的基本邏輯單位,裡面儲存的是有關檢視渲染的配置資訊,包括布局 渲染屬性 事件響應資訊等。實際上,flutter 種真正代表螢幕上顯示元素的類時eleme...