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