摘要:試用了一下,發(fā)現(xiàn)它是基于的主要是。于是拿的代碼改了一個純協(xié)程的版本出來。兩個都是以提供和為主要,把協(xié)程的隱藏在下面。為了搞一個更簡單的,純協(xié)程來玩,把里無關(guān)的代碼都給刪了。結(jié)果在這里和官方的版本的不同在于,添加了一個方法相當(dāng)于的。
試用了一下 http://docs.paralleluniverse.co/quasar/,發(fā)現(xiàn)它是基于JDK 1.7的(主要是fork join pool)。于是拿kilim的代碼改了一個純協(xié)程的版本出來。kilim的原始版本(https://github.com/kilim/kilim)里所有的Task都與一個Scheduler綁定,而且官方的例子里都是講怎么使用Mailbox做messaging的。這個路數(shù)和stackless python非常像。兩個都是以提供scheduler和messaging為主要api,把協(xié)程的api隱藏在下面。為了搞一個更簡單的,純協(xié)程api來玩,把kilim里無關(guān)的代碼都給刪了。結(jié)果在這里:https://github.com/taowen/kilim
和官方的版本的不同在于,Task添加了一個方法resume(相當(dāng)于greenlet的switch)。第一次執(zhí)行resume的時候就是開始執(zhí)行這個task。如果task yield了,就會中途退出。要在斷點(diǎn)繼續(xù)的話,再次調(diào)用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
要想執(zhí)行的話。要預(yù)先進(jìn)行weave。其實(shí)就是一條命令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)
關(guān)鍵點(diǎn)在于classes.dependsOn(weave),這樣可以讓weave在javaCompile之后,classes之前執(zhí)行。這種修改別的task的dependency的做法比ANT靈活多了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/64157.html
摘要:基本上所有的網(wǎng)絡(luò)應(yīng)用都會示范一個的寫法。除了這些操作的主體是而不是,操作的是,而不是。以為例其過程是這樣的這段代碼就是創(chuàng)建一個,并注冊一個,并把附著到上。關(guān)鍵之一顯然是利用了協(xié)程的和,把回調(diào)轉(zhuǎn)換成順序的邏輯執(zhí)行。 基本上所有的網(wǎng)絡(luò)應(yīng)用都會示范一個tcp的echo寫法。前面我們已經(jīng)看到了如何使用協(xié)程和異步io來做tcp服務(wù)器的第一步,accept。下面是一個完整的echo server的...
摘要:特別是最火的協(xié)程框架也無法保存狀態(tài),讓人非常惋惜。但是因為棧的本身無法持久化,所以也就無法持久化。其難度在于,假設(shè)整個要持久化的調(diào)用棧全部都是內(nèi)的,比如純的。采取的是暴力地把整個棧區(qū)域拷貝到上的方式來保存其狀態(tài)。 python主流的協(xié)程實(shí)現(xiàn)有五種: cPython的generator cPython的greenlet cPython的fibers stackless python ...
摘要:很長一段時間,我都很天真的認(rèn)為,特別是以為代表的庫,才是協(xié)程的樂土。里是沒法實(shí)現(xiàn)協(xié)程,更別說實(shí)現(xiàn)這樣可以的協(xié)程的。咱真的是太井底之蛙了。不完全列表如下還有一個據(jù)作者說是最的這些協(xié)程庫的實(shí)現(xiàn)方式都是類似的,都是通過字節(jié)碼生成達(dá)到的目的。 很長一段時間,我都很天真的認(rèn)為python,特別是以gevent為代表的庫,才是協(xié)程的樂土。Java里是沒法實(shí)現(xiàn)協(xié)程,更別說實(shí)現(xiàn)stackless py...
摘要:所以系統(tǒng)的吞吐能力取決于每個線程的操作耗時。另外過多的線程,也會帶來更多的開銷。其代表派是以及里的新秀。類似線程也有自己的棧。線程中斷的條件只有兩個,一個是拋異常,另外一個就是。 什么是協(xié)程(coroutine) 這東西其實(shí)有很多名詞,比如有的人喜歡稱為纖程(Fiber),或者綠色線程(GreenThread)。其實(shí)最直觀的解釋可以定義為線程的線程。有點(diǎn)拗口,但本質(zhì)上就是這樣。 我...
摘要:接下來,就看怎么用協(xié)程來實(shí)現(xiàn)異步了。直接拿的原始寫代碼會死人的。引入?yún)f(xié)程就是為了把上下連續(xù)的業(yè)務(wù)邏輯放在一個協(xié)程里,把與業(yè)務(wù)關(guān)系不大的的處理部分放到框架的里。第三部分是放棄掉執(zhí)行權(quán)。這樣一個只能接收打印一行的異步應(yīng)用就寫好了。 前面已經(jīng)準(zhǔn)備好了greenlet對應(yīng)的Java版本了,一個刪減后的kilim(http://segmentfault.com/blog/taowen/11900...
閱讀 1309·2021-11-15 11:37
閱讀 2564·2021-09-22 10:56
閱讀 3391·2021-09-06 15:11
閱讀 801·2021-08-31 09:45
閱讀 2897·2021-07-28 11:16
閱讀 1806·2019-08-30 15:44
閱讀 477·2019-08-30 13:22
閱讀 3344·2019-08-30 13:18