摘要:試用了一下,發現它是基于的主要是。于是拿的代碼改了一個純協程的版本出來。兩個都是以提供和為主要,把協程的隱藏在下面。為了搞一個更簡單的,純協程來玩,把里無關的代碼都給刪了。結果在這里和官方的版本的不同在于,添加了一個方法相當于的。
試用了一下 http://docs.paralleluniverse.co/quasar/,發現它是基于JDK 1.7的(主要是fork join pool)。于是拿kilim的代碼改了一個純協程的版本出來。kilim的原始版本(https://github.com/kilim/kilim)里所有的Task都與一個Scheduler綁定,而且官方的例子里都是講怎么使用Mailbox做messaging的。這個路數和stackless python非常像。兩個都是以提供scheduler和messaging為主要api,把協程的api隱藏在下面。為了搞一個更簡單的,純協程api來玩,把kilim里無關的代碼都給刪了。結果在這里:https://github.com/taowen/kilim
和官方的版本的不同在于,Task添加了一個方法resume(相當于greenlet的switch)。第一次執行resume的時候就是開始執行這個task。如果task yield了,就會中途退出。要在斷點繼續的話,再次調用resume。
package hello_world; import kilim.Pausable; import kilim.Task; public class Main { public static void main(String[] args) { Task task = new Task() { @Override public void execute() throws Pausable { System.out.println("hello"); yield(); System.out.println("world"); } }; task.resume(); System.out.println("hey there"); task.resume(); } }
代碼輸出如下
hello hey there world
要想執行的話。要預先進行weave。其實就是一條命令java kilim.tools.Weaver -d classesDir classesDir。但是要把這條命令整合到gradle的build過程中,還是很不容易的
apply plugin: "java" apply plugin: "application" mainClassName = "hello_world.Main" repositories { mavenCentral() mavenLocal() } configurations { kilim } dependencies { compile "org.slf4j:slf4j-api:1.7.5" compile "org.github.taowen:kilim:1.0" kilim "org.github.taowen:kilim:1.0" testCompile "junit:junit:4.11" } task weave(type: JavaExec) { classpath "$project.buildDir/classes/main" classpath configurations.kilim main = "kilim.tools.Weaver" args "-d", "$project.buildDir/classes/main", "$project.buildDir/classes/main" } classes.dependsOn(weave)
關鍵點在于classes.dependsOn(weave),這樣可以讓weave在javaCompile之后,classes之前執行。這種修改別的task的dependency的做法比ANT靈活多了。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64157.html
摘要:基本上所有的網絡應用都會示范一個的寫法。除了這些操作的主體是而不是,操作的是,而不是。以為例其過程是這樣的這段代碼就是創建一個,并注冊一個,并把附著到上。關鍵之一顯然是利用了協程的和,把回調轉換成順序的邏輯執行。 基本上所有的網絡應用都會示范一個tcp的echo寫法。前面我們已經看到了如何使用協程和異步io來做tcp服務器的第一步,accept。下面是一個完整的echo server的...
摘要:特別是最火的協程框架也無法保存狀態,讓人非常惋惜。但是因為棧的本身無法持久化,所以也就無法持久化。其難度在于,假設整個要持久化的調用棧全部都是內的,比如純的。采取的是暴力地把整個棧區域拷貝到上的方式來保存其狀態。 python主流的協程實現有五種: cPython的generator cPython的greenlet cPython的fibers stackless python ...
摘要:很長一段時間,我都很天真的認為,特別是以為代表的庫,才是協程的樂土。里是沒法實現協程,更別說實現這樣可以的協程的。咱真的是太井底之蛙了。不完全列表如下還有一個據作者說是最的這些協程庫的實現方式都是類似的,都是通過字節碼生成達到的目的。 很長一段時間,我都很天真的認為python,特別是以gevent為代表的庫,才是協程的樂土。Java里是沒法實現協程,更別說實現stackless py...
摘要:所以系統的吞吐能力取決于每個線程的操作耗時。另外過多的線程,也會帶來更多的開銷。其代表派是以及里的新秀。類似線程也有自己的棧。線程中斷的條件只有兩個,一個是拋異常,另外一個就是。 什么是協程(coroutine) 這東西其實有很多名詞,比如有的人喜歡稱為纖程(Fiber),或者綠色線程(GreenThread)。其實最直觀的解釋可以定義為線程的線程。有點拗口,但本質上就是這樣。 我...
摘要:接下來,就看怎么用協程來實現異步了。直接拿的原始寫代碼會死人的。引入協程就是為了把上下連續的業務邏輯放在一個協程里,把與業務關系不大的的處理部分放到框架的里。第三部分是放棄掉執行權。這樣一個只能接收打印一行的異步應用就寫好了。 前面已經準備好了greenlet對應的Java版本了,一個刪減后的kilim(http://segmentfault.com/blog/taowen/11900...
閱讀 1318·2021-11-15 11:37
閱讀 2575·2021-09-22 10:56
閱讀 3399·2021-09-06 15:11
閱讀 811·2021-08-31 09:45
閱讀 2910·2021-07-28 11:16
閱讀 1815·2019-08-30 15:44
閱讀 484·2019-08-30 13:22
閱讀 3352·2019-08-30 13:18