精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么我放棄使用 Kotlin 中的協程?

開發 前端
實不相瞞,我對 Kotlin 這門編程語言非常喜歡,盡管它有一些缺點和奇怪的設計選擇。我曾經參與過一個使用 Kotlin、Kotlin 協程(coroutine, 下同)和基于協程的服務器框架 KTOR 的中型項目。

 實不相瞞,我對 Kotlin 這門編程語言非常喜歡,盡管它有一些缺點和奇怪的設計選擇。我曾經參與過一個使用 Kotlin、Kotlin 協程(coroutine, 下同)和基于協程的服務器框架 KTOR 的中型項目。這個技術組合提供了很多優點,但是我也發現,與常規的 Spring Boot 相比,它們很難使用。

[[330673]]

聲明:我無意抨擊相關技術,我的目的僅是分享我的使用體驗,并解釋為什么我以后不再考慮使用。

調試

請看下面一段代碼。

  1. suspend fun retrieveData(): SomeData { 
  2.     val request = createRequest() 
  3.     val response = remoteCall(request) 
  4.     return postProcess(response) 
  5.  
  6. private suspend fun remoteCall(request: Request): Response { 
  7.    // do suspending REST call 

假設我們要調試 retrieveData 函數,可以在第一行中放置一個斷點。然后啟動調試器(我使用的是 IntelliJ),它在斷點處停止。現在我們執行一個 Step Over(跳過調用 createRequest),這也正常。但是如果再次 Step Over,程序就會直接運行,調用 remoteCall() 之后不會停止。

為什么會這樣?JVM 調試器被綁定到一個 Thread 對象上。當然,這是一個非常合理的選擇。然而,當引入協程之后,一個線程不再做一件事。仔細一看:remoteCall(request) 調用的是一個 suspend 函數,雖然我們在調用它的時候并沒有在語法中看到它。那么會發生什么?我們執行調試器 "step over ",調試器運行 remoteCall 的代碼并等待。

這就是難點所在:當前線程(我們的調試器被綁定到該線程)只是我們的coroutine 的執行者。當我們調用 suspend 函數時,會發生的情況是,在某個時刻,suspend 函數會 yield。這意味著另外一個 Thread 將繼續執行我們的方法。我們有效地欺騙了調試器。

我發現的唯一的解決方法是在我想執行的行上放置一個斷點,而不是使用Step Over。不用說,這是個大麻煩。而且很顯然,這不僅僅是我一個人的問題。

此外,在一般的調試中,很難確定一個單一的 coroutine 當前在做什么,因為它在線程之間跳躍。當然,coroutine 是有名字的,你可以在日志中不僅打印線程,還可以打印 coroutine 的名字,但根據我的經驗,調試基于 coroutine 的代碼所需的心智負擔,要比基于線程的代碼高很多。

REST 調用中綁定 context 數據

在微服務上開發,一個常見的設計模式是,接收一個某種形式認證的 REST 調用,并將相同的認證傳遞給其他微服務的所有內部調用。在最簡單的情況下,我們至少要保留調用者的用戶名。

然而,如果這些對其他微服務的調用在我們調用棧中嵌套了 10 層深度怎么辦?我們當然不希望在每個函數中都傳遞一個認證對象作為參數。我們需要某種形式的 "context",這種 context 是隱性存在的。

在傳統的基于線程的框架中,如 Spring,解決這個問題的方法是使用 ThreadLocal 對象。這使得我們可以將任何一種數據綁定到當前線程。只要一個線程對應一個 REST 調用(你應該始終以這個為目標),這正是我們需要的。這個模式的很好的例子是 Spring 的 SecurityContextHolder。

對于 coroutine,情況就不同了。一個 ThreadLocal 不再對應一個協程,因為你的工作負載會從一個線程跳到另一個線程;不再是一個線程在其整個生命周期內伴隨一個請求。在 Kotlin coroutine 中,有 CoroutineContext。本質上,它不過是一個 HashMap,與 coroutine 一起攜帶(無論它運行在哪個線程上)。它有一個可怕的過度設計的 API,使用起來很麻煩,但這不是這里的主要問題。

真正的問題是,coroutine 不會自動繼承上下文。

例如:

  1. suspend fun sum(): Int { 
  2.     val jobs = mutableListOf<Deferred<Int>>() 
  3.     for(child in children){ 
  4.         jobs += async {  // we lose our context here! 
  5.             child.evaluate()  
  6.         } 
  7.     } 
  8.     return jobs.awaitAll().sum() 

每當你調用一個 coroutine builder,如 async、runBlocking 或 launch,你將(默認情況下)失去你當前的 coroutine 上下文。你可以通過將上下文顯式地傳遞到 builder 方法中來避免這種情況,但是上帝保佑你不要忘記這樣做(編譯器不會管這些!)。

一個子 coroutine 可以從一個空的上下文開始,如果有一個上下文元素的請求進來,但沒有找到任何東西,可以向父 coroutine 上下文請求該元素。然而,在 Kotlin 中不會發生這種情況,開發人員需要手動完成,每一次都是如此。

如果你對這個問題的細節感興趣,我建議你看看這篇博文。

https://blog.tpersson.io/2018/04/22/emulating-request-scoped-objects-with-kotlin-coroutines/

synchronized 不再如你想的那樣工作

在 Java 中處理鎖或 synchronized 同步塊時,我考慮的語義通常是 "當我在這個塊中執行時,其他調用不能進入"。當然“其他調用”意味著存在某種身份,在這里就是線程,這應該在你的腦海中升起一個大紅色的警告信號。

看看下面的例子。

  1. val lock = ReentrantLock() 
  2.  
  3. suspend fun doWithLock(){ 
  4.    lock.withLock { 
  5.        callSuspendingFunction() 
  6.    } 

這個調用很危險,即使 callSuspendingFunction() 沒有做任何危險的操作,代碼也不會像你想象的那樣工作。

  • 進入同步鎖
  • 調用 suspend 功能
  • 協程 yield,當前線程仍然持有鎖。
  • 另一個線程繼續我們的 coroutine
  • 還是同一個協程,但我們不再是鎖的 owner 了!

潛在的沖突、死鎖或其他不安全的情況數量驚人。你可能會說,我們只是需要設計我們的代碼來處理這個問題。我同意,然而我們談論的是 JVM。那里有一個龐大的 Java 庫生態。而它們并沒有做好處理這些情況的準備。

這里的結果是:當你開始使用 coroutine 的時候,你就放棄了使用很多 Java 庫的可能性,因為它們目前只能工作在基于線程的環境。

單機吞吐量與水平擴展

對于服務器端來說,coroutine 的一大優勢是,一個線程可以處理更多的請求;當一個請求等待數據庫響應時,同一個線程可以愉快地服務另一個請求。特別是對于 I/O 密集型任務,這可以提高吞吐量。

然而,正如這篇博文所希望向您展示的那樣,在許多層面上,使用 coroutine 都有一個非零成本的開銷。

由此產生的問題是:這個收益是否值得這個成本?而在我看來,答案是否定的。在云和微服務環境中,有一些現成的擴展機制,無論是 Google AppEngine、AWS Beanstalk 還是某種形式的 Kubernetes。如果當前負載增加,這些技術將簡單地按需生成你的微服務的新實例。因此,考慮到引入 coroutine 帶來的額外成本,單一實例所能處理的吞吐量就不那么重要了。這就降低了我們使用 coroutine 所獲得的價值。

Coroutine 有其存在的價值

話說回來,Coroutine 還是有其使用場景。當開發只有一個 UI 線程的客戶端 UI 時,coroutine 可以幫助改善你的代碼結構,同時符合 UI 框架的要求。聽說這個在安卓系統上很好用。Coroutine 是一個有趣的主題,然而對于服務器端開發來說,我覺得協程還差點意思。JVM 開發團隊目前正在開發 Fiber,本質上也是 coroutine,但他們的目標是與 JVM 基礎庫更好共存。這將是有趣的,看它將來如何發展,以及 Jetbrains 對 Kotlin coroutine 對此會有什么反應。在最好的情況下,Kotlin coroutine 將來只是簡單映射到 Fiber 上,而調試器也能足夠聰明來正確處理它們。

英文原文:

https://dev.to/martinhaeusler/why-i-stopped-using-coroutines-in-kotlin-kg0

本文轉載自微信公眾號「高可用架構」,可以通過以下二維碼關注。轉載本文請聯系高可用架構公眾號。

 

責任編輯:武曉燕 來源: 高可用架構
相關推薦

2023-10-24 19:37:34

協程Java

2023-07-23 17:19:34

人工智能系統

2019-10-23 14:34:15

KotlinAndroid協程

2025-08-08 08:23:49

2020-08-14 10:40:35

RestTemplatRetrofitJava

2021-02-01 07:20:51

KafkaPulsar搜索

2020-03-03 15:31:47

ReactVue前端

2021-05-20 09:14:09

Kotlin協程掛起和恢復

2022-10-28 10:45:22

Go協程GoFrame

2011-06-08 10:30:08

MongoDB

2018-12-21 11:26:49

MySQLMongoDB數據庫

2020-02-19 14:16:23

kotlin協程代碼

2025-05-16 08:21:45

2020-07-23 08:07:47

數組upData庫函數

2021-09-16 09:59:13

PythonJavaScript代碼

2021-04-28 09:08:23

Kotlin協程代碼

2025-02-28 09:04:08

2023-11-17 11:36:59

協程纖程操作系統

2021-04-25 09:36:20

Go協程線程

2017-10-23 12:42:42

點贊
收藏

51CTO技術棧公眾號

国产精品久久久久久av公交车| 色婷婷中文字幕| 日韩一区二区在线| 欧美一区二区国产| 成人黄色大片网站| 秋霞av在线| 理论电影国产精品| 欧美极品少妇与黑人| 亚洲成人av免费在线观看| 在线成人视屏| 一区二区欧美在线观看| 蜜桃麻豆91| 国产毛片毛片毛片毛片| 日韩午夜黄色| 日韩一区二区av| 中文字幕在线永久| 日本a人精品| 精品国产精品自拍| 日本一区二区免费高清视频| 亚洲第一视频在线播放| 老牛国产精品一区的观看方式| 久久久精品国产| 白丝女仆被免费网站| 电影91久久久| 在线观看亚洲精品| 被灌满精子的波多野结衣| 91在线网址| 91女人视频在线观看| 91精品视频免费| 无码人妻精品一区二区三区9厂| 欧美激情自拍| 日韩中文字幕精品| 人人妻人人藻人人爽欧美一区| 日韩欧美高清一区二区三区| 91久久人澡人人添人人爽欧美 | 99久久精品费精品国产| 亚洲国模精品一区| 在线观看你懂的视频| a∨色狠狠一区二区三区| 欧美日韩亚洲高清| 97超碰人人澡| 免费网站在线观看人| 中文字幕免费不卡| 茄子视频成人在线观看 | 亚洲视频免费播放| 欧美涩涩视频| 色综合久久悠悠| 欧美做爰爽爽爽爽爽爽| 久久日文中文字幕乱码| 亚洲偷欧美偷国内偷| 亚洲一区二区乱码| 欧美91在线| 精品国产青草久久久久福利| 天堂av.com| 色综合一区二区日本韩国亚洲| 在线欧美日韩精品| 黄色国产精品视频| 天堂网在线最新版www中文网| 亚洲图片欧美视频| 乱熟女高潮一区二区在线| 黄色的网站在线观看| 国产精品国产自产拍高清av王其| 天天综合狠狠精品| yiren22亚洲综合伊人22| 久久综合久久综合久久综合| 欧美久久在线| 免费观看成年在线视频网站| 久久久久久一级片| 日本一区二区三区精品视频| 丁香婷婷在线| 日韩一区欧美小说| 青草全福视在线| 日韩伦理av| 午夜视频在线观看一区二区三区| 无码粉嫩虎白一线天在线观看 | 国产人妖在线观看| 波多野结衣在线一区二区| 欧美精品一区二区三区视频| 中文字幕影片免费在线观看| 综合色就爱涩涩涩综合婷婷| 亚洲一级一级97网| 激情高潮到大叫狂喷水| 一区二区三区在线| 久久久久女教师免费一区| 日韩精品人妻中文字幕| 久久黄色网页| 成人高清视频观看www| av免费观看网址| 99久久精品久久久久久清纯| 日本午夜精品电影| 国产福利视频在线| 午夜精品福利一区二区三区av| 黄色免费观看视频网站| 啪啪av大全导航福利综合导航 | 色在线免费视频| 亚洲国产精品高清| 97中文字幕在线| 欧美xxx性| 日韩写真欧美这视频| 波多野结衣一二三区| 欧美裸体在线版观看完整版| 美女久久久久久久久久久| 可以免费看的av毛片| 免费在线观看精品| 国产麻豆一区二区三区在线观看| 精品福利视频导航大全| 亚洲日本一区二区三区| 免费无码不卡视频在线观看| 欧美高清你懂的| 欧美精品一区二区在线播放| 波多野结衣久久久久| 亚洲另类自拍| 成人黄色免费看| 五月婷中文字幕| 中文字幕在线不卡视频| 人妻精品无码一区二区三区 | 销魂美女一区二区三区视频在线| 国产日韩欧美黄色| 四虎影视2018在线播放alocalhost| 国产精品电影一区二区三区| 日韩在线综合网| 精品一区二区三区亚洲| 亚洲性无码av在线| 日韩精品人妻中文字幕| 国产一区二区不卡| 日本10禁啪啪无遮挡免费一区二区| 中文字幕有码在线视频| 欧美色男人天堂| 丝袜美腿中文字幕| 在线欧美不卡| 99在线观看| 操你啦视频在线| 精品视频1区2区3区| 鲁大师私人影院在线观看| 1024精品久久久久久久久| 国产精品电影在线观看| 色综合成人av| 色综合天天综合网国产成人综合天| 第一页在线视频| 欧美在线首页| 91亚洲一区精品| 久热国产在线| 欧美精品v国产精品v日韩精品| 亚洲色图 激情小说| 美女尤物久久精品| 久久亚裔精品欧美| 午夜影视一区二区三区| 日韩电影免费观看在线观看| 国产污视频在线看| 成人精品国产免费网站| 欧美精品卡一卡二| 另类尿喷潮videofree| 91精品国产高清| 亚洲欧美一区二区三| 性做久久久久久久久| 伊人网综合视频| 999在线观看精品免费不卡网站| 国产成人精品免费视频大全最热 | 亚洲日本va午夜在线影院| 国产精品拍拍拍| 日韩大片在线观看| 国产在线视频欧美| 黄色片免费在线观看| 正在播放亚洲一区| 日韩影院一区二区| 激情av综合网| 国产肉体ⅹxxx137大胆| 美女国产精品久久久| 另类色图亚洲色图| 国产免费视频一区二区三区| 18成人在线观看| 黑人玩弄人妻一区二区三区| 国产精品分类| 国产一区二区三区四区hd| av漫画网站在线观看| 亚洲国产另类 国产精品国产免费| 国产在线观看你懂的| 成人免费视频网站在线观看| 91免费黄视频| 综合色就爱涩涩涩综合婷婷| 国产精品国产三级国产专播精品人 | 亚洲色欲色欲www| 亚洲丝袜在线观看| 国产综合精品一区| 国产亚洲一区二区三区在线播放 | 一区二区日韩av| 成人欧美精品一区二区| 亚洲国产网站| 欧美二区三区| 久久91超碰青草在哪里看| www.精品av.com| 天堂在线视频观看| 色美美综合视频| 99久久久无码国产精品不卡| 久久电影网站中文字幕| 热这里只有精品| 九一国产精品| 96pao国产成视频永久免费| 欧美v亚洲v| 亚洲欧洲激情在线| www.日本在线观看| 日韩欧美在线免费| 黄色av片三级三级三级免费看| 国产老肥熟一区二区三区| 97在线免费视频观看| 国产精品探花在线观看| 成人性生交大片免费看视频直播| 日韩av毛片| 亚洲最新在线视频| www.黄色小说.com| 色天天综合色天天久久| av激情在线观看| 久久一二三国产| 日本高清一区二区视频| 免费看黄裸体一级大秀欧美| 中文字幕日韩精品一区二区| 欧美男人操女人视频| 国产精品三级网站| 一二三四视频在线中文| 久久影视免费观看 | 国产成人午夜视频| 九九视频精品在线观看| 一本久道综合久久精品| 中文字幕一区二区三区乱码| 日韩欧美黄色| 99国产在线| 奇米777日韩| 91高潮精品免费porn| 麻豆系列在线观看| 亚洲另类图片色| 亚洲xxxx天美| 日韩一区二区三区视频在线| 黄色污污视频软件| 午夜视黄欧洲亚洲| 天天鲁一鲁摸一摸爽一爽| 欧美国产欧美亚州国产日韩mv天天看完整| 日本wwwwwww| 精品一区二区综合| 韩国日本美国免费毛片| 欧美日韩综合| 2021国产视频| 爽成人777777婷婷| 日本一区二区三区免费观看 | 奇米影视首页 狠狠色丁香婷婷久久综合| 亚洲国产一区二区三区网站| 国产玖玖精品视频| 欧洲一级精品| 国产精品黄页免费高清在线观看| 日韩欧美一中文字暮专区| 色综合久久天天综线观看| 日本黄色片在线观看| 日韩在线小视频| www.视频在线.com| 亚洲欧美日韩中文视频| 无码国产精品96久久久久| 日韩欧美一级二级| 国产精品一区二区免费视频 | 国产又粗又猛又爽又黄的视频一| 欧美三级资源在线| 午夜久久久久久久久久影院| 欧美性精品220| 成年人视频在线免费看| 日韩欧美在线免费| 波多野结衣电车痴汉| 一本久久精品一区二区| 亚洲GV成人无码久久精品| 日本高清不卡视频| 中文字幕永久在线| 欧美色综合久久| 亚洲天堂手机版| 欧美一区二区视频在线观看2020 | 免费a级片在线观看| 日韩欧美一区中文| 精品国产av一区二区三区| 亚洲精品一区二区三区蜜桃下载| 亚洲xxx在线| 日韩av影视综合网| 你懂的在线观看视频网站| 亚洲最大在线视频| 欧美成人精品一区二区男人看| xvideos国产精品| 中文字幕伦理免费在线视频| 992tv在线成人免费观看| 午夜久久中文| 国产精品久久久久久久久久三级| 三级成人黄色影院| 国产日韩av在线播放| 亚洲视频三区| 久久国产精品一区二区三区| 妖精一区二区三区精品视频 | 日韩精品免费一区二区在线观看| 欧美精品一区二区性色a+v| 欧美99在线视频观看| 亚洲精品久久久久久久蜜桃臀| 国产日韩欧美在线播放不卡| 国产亚洲视频一区| 国产成人福利片| 亚洲国产欧美视频| 亚洲国产精品传媒在线观看| 国产无套在线观看| 欧美中文字幕一二三区视频| 国产伦精品一区二区三区免.费 | 天堂在线视频免费| 亚洲小视频在线观看| 日本不卡三区| 欧洲精品久久久| 国产精品一区二区美女视频免费看 | 日本在线观看中文字幕| 日韩欧美精品网站| 一级做a爱片久久毛片| 亚洲精品狠狠操| 色的视频在线免费看| 91精品国产高清| 国产人与zoxxxx另类91| 欧美人与物videos另类| 婷婷伊人综合| 国产男女无遮挡| 激情图片小说一区| 国产精成人品免费观看| 亚洲黄色免费电影| 黄色大全在线观看| 欧美大片在线观看一区| 日本高清视频在线观看| 91国产精品91| 玖玖玖电影综合影院| 日韩精品无码一区二区三区| 欧美午夜影院| 中文字幕网av| 26uuu久久天堂性欧美| 国产一级片免费看| 777亚洲妇女| 国产一区电影| 热久久这里只有精品| 视频欧美一区| 亚洲一区三区视频在线观看| 性色一区二区| 亚洲自拍偷拍一区二区| 亚洲一区二区视频在线观看| 亚洲天堂狠狠干| www.久久久久| 国产激情欧美| 日本一区视频在线观看| 久久综合国产| 特级丰满少妇一级| 91麻豆精品秘密| 国产中文字幕免费| 日韩一区国产二区欧美三区| 亚洲视频tv| 国产在线观看一区二区三区| 精品国精品国产自在久国产应用| 欧美二区在线视频| 国产精品一区二区在线播放| 久久一级免费视频| 欧美在线制服丝袜| 韩国福利在线| 久久久久久国产精品美女| 久久天堂久久| 99色这里只有精品| 成人午夜电影小说| 久久精品www人人爽人人| 日韩欧美中文字幕制服| 成人短视频在线| 91亚洲精品一区| 中文av一区| 无码成人精品区在线观看| 亚洲黄色性网站| 亚洲精品成人区在线观看| 国内久久久精品| 欧美1区2区3区4区| 成人在线免费在线观看| 久久精品这里都是精品| 中文字幕av第一页| 神马久久久久久| 欧美午夜三级| 日韩a级黄色片| 成人国产精品免费网站| 久久久久97国产| 亚洲人成网站在线播| 日韩成人亚洲| 一区二区三区四区| 成人免费视频app| 亚洲伊人成人网| 一本色道久久88亚洲综合88| 亚洲综合视频| 91视频 - 88av| 99久久久国产精品| 怡红院男人天堂| 欧美日韩爱爱视频| 日韩美脚连裤袜丝袜在线| 中文字幕免费高清在线| 亚洲专区一二三| 日韩在线免费看| 成人激情在线播放| 亚洲二区在线| 欧美性受xxxx黑人| 日韩三级av在线播放| 日韩深夜视频| 黄色www在线观看| eeuss鲁片一区二区三区在线观看| 手机看片久久久|