当前位置: 首页 > news >正文

胶州网站优化价格乔拓云建站有免费的吗

胶州网站优化价格,乔拓云建站有免费的吗,做网站的空间要多大的,优秀企业网站建设哪家服务好Quasar是一个向JVM添加真正的轻量级线程#xff08;纤维#xff09;的库。 它们非常便宜且非常快-实际上#xff0c;光纤的行为就像Erlang进程或Go goroutines-并允许您编写简单的阻塞代码#xff0c;同时享受与复杂异步代码相同的性能优势。 在本文中#xff0c;我们将学… Quasar是一个向JVM添加真正的轻量级线程纤维的库。 它们非常便宜且非常快-实际上光纤的行为就像Erlang进程或Go goroutines-并允许您编写简单的阻塞代码同时享受与复杂异步代码相同的性能优势。 在本文中我们将学习如何将任何基于回调的异步API转换为漂亮的光纤阻塞API。 它适用于希望将自己的或第三方库与Quasar光纤集成的用户。 如果您仅将Quasar光纤与通道或演员一起使用或者利用Comsat项目中已经提供的许多集成功能则不需要了解这些知识下面提供的代码是应用程序开发人员从未看到的代码。 但是即使您不这样做您也可能会发现这篇文章对理解Quasar如何发挥其魔力很有帮助。 为什么要异步 首先许多库提供异步API的原因是OS可以处理的正在运行的1个线程的数量远远少于OS可以维护的开放TCP连接的数量。 也就是说您的计算机所支持的并发性比线程所提供的要高得多因此库以及使用它们的开发人员会放弃线程将其作为用于软件并发性单元2的抽象。 异步API不会阻塞线程并可能导致显着的性能提升通常在吞吐量和服务器容量方面而在延迟方面却没有那么多。 但是使用异步API也会创建正确获得“回调地狱”名称的代码。 在缺乏多核处理的环境例如Javascript中回调地狱已经很糟糕了。 在那些需要关注内存可见性和同步性的环境例如JVM中情况可能会更糟。 编写在光纤上运行的阻塞代码可为您提供与异步代码相同的优点而没有缺点您使用了不错的阻塞API甚至可以继续使用现有的API但是却获得了非阻塞代码的所有性能优势。 可以肯定的是异步API还有一个优势它们使您可以同时分派多个IO操作例如HTTP请求。 因为这些操作通常需要很长时间才能完成而且通常是独立的所以我们可以同时等待其中的几个完成。 但是Java期货也可以使用此有用的功能而无需回调。 稍后我们将看到如何制作纤维增强期货。 光纤异步 许多现代的Java IO /数据库库/驱动程序都提供两种API一种是同步线程阻塞的API另一种是基于回调的异步API对于NIOJAX-RS客户端Apache HTTP客户端以及更多的API来说都是如此。 。 同步API更好。 Quasar有一个编程工具可以将任何基于回调的异步API转换为一个很好的阻止光纤的API FiberAsync 。 本质上 FiberASync所做的是阻止当前光纤安装异步回调并在触发该回调时它将再次唤醒光纤并返回操作结果如果失败则引发异常。 为了了解如何使用FiberAsync 我们将看一个API示例 FooClient 。 FooClient是一种现代的IO API因此有两种形式一种是同步的线程阻止一种另一种是异步的。 他们来了 interface FooClient {String op(String arg) throws FooException, InterruptedException; }interface AsyncFooClient {FutureString asyncOp(String arg, FooCompletionString callback); }interface FooCompletionT {void success(T result);void failure(FooException exception); } 请注意异步操作如许多现代库中的情况如何都需要回调并返回前途。 现在让我们忽略未来。 我们稍后再讲。 FooClient比AsyncFooClient更好更简单但是它阻塞了线程并大大降低了吞吐量。 我们想要创建一个FooClient接口的实现该接口可以在光纤中运行并阻塞光纤因此我们获得了简单的代码和高吞吐量。 为此我们将在AsyncFooClient使用AsyncFooClient 但将其转换为阻止光纤的FooClient 。 这是我们需要的所有代码我们将进一步对其进行简化 public class FiberFooClient implements FooClient {private final AsyncFooClient asyncClient;public FiberFooClient(AsyncFooClient asyncClient) {this.asyncClient asyncClient;}OverrideSuspendableString op(final String arg) throws FooException, InterruptedException {try {return new FiberAsyncString, FooException() {Overrideprotected void requestAsync() {asyncClient.asyncOp(arg, new FooCompletionString() {public void success(String result) {FiberAsync.this.asyncCompleted(result);}public void failure(FooException exception) {FiberAsync.this.asyncFailed(exception);}});}}.run();} catch(SuspendExecution e) {throw new AssertionError(e);}} } 现在这是怎么回事 我们正在实施的FooClient接口但我们正在做op纤维粘连而不是线程阻塞。 我们需要告诉Quasar我们的方法是光纤阻塞或“可挂起”因此我们使用Suspendable对其进行Suspendable 。 然后我们将FiberAsync子类FiberAsync并实现requestAsync方法 FiberAsync接受的两个通用类型参数是返回类型和操作可能抛出的已检查异常的类型如果有对于没有已检查异常的情况第二个通用参数应为RuntimeException 。 requestAsync负责启动异步操作并注册回调。 然后回调需要调用asyncCompleted 如果操作成功并将其传递给我们希望返回的结果或者asyncFailed 如果操作失败并将失败原因的异常传递给它。 最后我们调用FiberAsync.run() 。 这将阻止当前的光纤并调用requestAsync来安装回调。 纤维将保持阻塞直到回调被触发它会释放出FiberAsync通过调用或者asyncCompleted或asyncFailed 。 run方法还具有一个带超时参数的版本如果我们想对阻塞操作进行时间限制通常是个好主意该方法很有用。 需要解释的另一件事是try/catch块。 有两种方法来声明可Suspendable的方法用Suspendable对其进行注释或者声明它以引发已检查的异常SuspendExecution 。 FiberAsync的run方法使用了后者因此为了编译代码我们需要捕获SuspendExecution 但是由于这不是真正的异常因此我们永远无法真正捕获它嗯至少在Quasar运行正常的情况下至少不是这样 –因此为AssertionError 。 完成后您可以在任何光纤中使用op 如下所示 new FiberVoid(() -{// ...String res client.op();// ... }).start(); 顺便说一句所有的要短很多与脉冲星 类星体的Clojure的API其中异步操作 (async-op arg #(println result: %)) 使用Pulsar的await宏将其转换为以下同步的光纤阻塞代码 (println result: (await (async-op arg)))简化和批量生产 通常像FooClient这样的接口将具有许多方法并且通常 AsyncFooClient大多数方法将采用相同类型的回调 FooCompletion 。 如果是这种情况我们可以将我们已经看到的许多代码封装到FiberAsync的命名子类中 abstract class FooAsyncT extends FiberAsyncT, FooException implements FooCompletionT {Overridepublic void success(T result) {asyncCompleted(result);}Overridepublic void failure(FooException exception) {asyncFailed(exception);}OverrideSuspendablepublic T run() throws FooException, InterruptedException {try {return super.run();} catch (SuspendExecution e) {throw new AssertionError();}}OverrideSuspendablepublic T run(long timeout, TimeUnit unit) throws FooException, InterruptedException, TimeoutException {try {return super.run(timeout, unit);} catch (SuspendExecution e) {throw new AssertionError();}} } 请注意我们如何使FiberAsync直接实现FooCompletion回调–不是必需的但这是一个有用的模式。 现在我们的光纤阻塞op方法要简单得多并且该接口中的其他操作也可以轻松实现 Override Suspendable public String op(final String arg) throws FooException, InterruptedException {return new FooAsyncString() {protected void requestAsync() {asyncClient.asyncOp(arg, this);}}.run(); } 有时我们可能希望在常规线程而不是光纤上调用op方法。 默认情况下如果在线程上调用FiberAsync.run()会引发异常。 为了解决这个问题我们要做的就是实现另一个FiberAsync方法requestSync 如果在光纤上调用run 它将调用原始的同步API。 我们的最终代码如下所示我们假设FiberFooClass具有类型为FooClient的syncClient字段 Override Suspendable public String op(final String arg) throws FooException, InterruptedException {return new FooAsyncString() {protected void requestAsync() {asyncClient.asyncOp(arg, this);}public String requestSync() {return syncClient.op(arg);}}.run(); } 就是这样 期货 期货是一种方便的方法它允许我们在等待所有独立的长时间IO操作完成时同时开始它们。 我们希望我们的纤维能够阻挡期货。 许多Java库通过其异步操作返回期货因此用户可以在完全异步基于回调的用法和采用期货的“半同步”用法之间进行选择。 我们的AsyncFooClient接口就是这样工作的。 这是我们实现AsyncFooClient版本的AsyncFooClient 该版本返回阻止光纤的期货 import co.paralleluniverse.strands.SettableFuture;public class FiberFooAsyncClient implements FooClient {private final AsyncFooClient asyncClient;public FiberFooClient(AsyncFooClient asyncClient) {this.asyncClient asyncClient;}Overridepublic FutureString asyncOp(String arg, FooCompletionString callback) {final SettableFutureT future new SettableFuture();asyncClient.asyncOp(arg, callbackFuture(future, callback))return future;}private static T FooCompletionT callbackFuture(final SettableFutureT future, final FooCompletionT callback) {return new FooCompletionT() {Overridepublic void success(T result) {future.set(result);callback.completed(result);}Overridepublic void failure(Exception ex) {future.setException(ex);callback.failed(ex);}Overridepublic void cancelled() {future.cancel(true);callback.cancelled();}};} } 如果返回 co.paralleluniverse.strands.SettableFuture返回co.paralleluniverse.strands.SettableFuture 如果我们在光纤或普通线程即任何类型的绞线上 上对其进行阻塞则同样可以很好地工作。 JDK 8的CompletableFuture和Guava的ListenableFuture 返回到CompletionStage 或实现它的CompletableFuture 的API在JDK 8中添加到Java中可以通过预先构建的FiberAsync更加轻松地进行光纤阻塞。 例如 CompletableFutureString asyncOp(String arg); 通过以下方式变成光纤阻塞呼叫 String res AsyncCompletionStage.get(asyncOp(arg)); 返回Google Guava的方法类似地转换为光纤阻塞同步因此 ListenableFutureString asyncOp(String arg); 通过以下方式变成光纤阻塞 String res AsyncListenableFuture.get(asyncOp(arg));期货的替代品 尽管期货有用且熟悉但我们实际上并不需要使用纤维时返回它们的特殊API。 产生的纤维是如此便宜 Fiber类实现了Future 因此纤维本身可以代替“手工”的期货。 这是一个例子 void work() {FiberString f1 new Fiber(() - fiberFooClient.op(first operation));FiberString f2 new Fiber(() - fiberFooClient.op(second operation));String res1 f1.get();String res2 f2.get(); } 因此即使我们使用的API不提供光纤也可以为我们提供期货。 如果没有异步API怎么办 有时我们很不幸地遇到一个仅提供同步线程阻塞API的库。 JDBC是此类API的主要示例。 虽然Quasar不能提高使用此类库的吞吐量但是使API光纤兼容仍然值得实际上非​​常容易。 为什么 因为调用同步服务的光纤也可能做其他事情。 实际上它们可能很少调用该服务仅当发生高速缓存未命中时才考虑从RDBMS读取数据的光纤。 实现此目的的方法是通过在专用线程池中执行实际的调用然后通过FiberAsync封装该假的异步API将阻塞API转变为异步API。 这个过程是如此机械 FiberAsync有一些静态方法可以为我们处理所有事情。 因此假设我们的服务仅公开了阻塞的FooClient API。 要使其成为光纤阻塞我们要做的是 public class SadFiberFooClient implements FooClient {private final FooClient client;private static final ExecutorService FOO_EXECUTOR Executors.newCachedThreadPool();public FiberFooClient(FooClient client) {this.client client;}OverrideSuspendableString op(final String arg) throws FooException, InterruptedException {try {return FiberAsync.runBlocking(FOO_EXECUTOR, () - client.op());} catch(SuspendExecution e) {throw new AssertionError(e);}} } FooClient此实现可以安全地用于线程和光纤。 实际上当在普通线程上调用该方法时该方法将不会费心将操作分派到所提供的线程池而是在当前线程上执行该操作–就像我们使用原始FooClient实现那样。 结论 此处显示的技术FiberAsync和cpstrands.SettableFuture正是构成Comsat项目的集成模块的工作方式。 Comsat包括ServletJAX-RS服务器和客户端JDBCJDBIjOOQMongoDBRetrofit和Dropwizard的集成。 重要的是要了解如何-创建简单且高性能的光纤阻塞API-我们确实重新实现了API 接口 但没有实现其内部工作仍然仅通过其异步API使用原始库代码其丑陋之处在于现在对图书馆用户隐藏了。 额外信用单子怎么样 除了纤程外还有其他方法可以处理回调地狱。 JVM世界中最著名的机制是Scala的可组合期货RxJava的可观察对象以及JDK 8的CompletionStage / CompletableFuture 。 这些都是单子和单子组成的例子。 Monad可以工作有些人喜欢使用它们但是我认为对于大多数编程语言来说它们是错误的方法。 您会看到单子是从基于lambda演算的编程语言中借用的。 Lambda演算是一种理论计算模型与Turing机器完全不同但完全类似。 但是与图灵机模型不同lambda微积分计算没有步骤动作或状态的概念。 这些计算没有做任何事情; 他们只是。 那么Monads是Haskell等基于LC的语言将动作状态时间等描述为纯计算的一种方式。 它们是LC语言告诉计算机“先执行然后再执行”的一种方法。 问题是命令式语言已经有了“先做然后再做”的抽象而这种抽象就是线程。 不仅如此而且是必须的语言通常有一个非常简单的符号“这样做然后做”声明此后跟该语句。 命令式语言甚至考虑采用这种外来概念的唯一原因是因为通过OS内核线程的实现不令人满意。 但是与其采用一个陌生陌生的概念一个需要完全不同类型的API的概念不如采用一个相似但细微不同的抽象最好是修复线程的实现。 光纤保留抽象并修复实现。 Java和Scala等语言中的monad的另一个问题是这些语言不仅势在必行而且还允许不受限制的共享状态突变和副作用-Haskell却没有。 无限制的共享状态突变和“线程”单核的结合可能是灾难性的。 在纯FP语言中-由于副作用是受控的-计算单位即功能也是并发单位您可以安全地同时执行任何一对功能。 当您不受限制的副作用时情况并非如此。 函数执行的顺序是否可以同时执行两个函数以及一个函数是否以及何时可以观察到另一个函数执行的共享状态突变都是非常重要的问题。 结果作为“线程” monad的一部分运行的函数要么必须是纯函数没有任何副作用要么必须非常小心如何执行这些副作用。 这正是我们要避免的事情。 因此尽管单子组合确实比回调地狱生成了更好的代码但它们不能解决异步代码引入的任何并发问题。 聚苯乙烯 上一节不应理解为像Haskell这样的纯“ FP”语言的认可因为我实际上认为它们带来了太多其他问题。 我相信不久的将来是命令式语言3 它将允许共享状态变异但具有一些事务语义。 我相信那些未来的语言将主要从Clojure和Erlang等语言中获得灵感。 通过运行我的意思是线程往往不够可运行↩ 见利特尔法则可扩展性和容错 ↩ 它们是否“功能化”是一个难题因为没有人对功能性编程语言是什么以及它与非功能性语言的区别提出了很好的定义。 ↩ 翻译自: https://www.javacodegeeks.com/2015/04/farewell-to-asynchronous-code.html
http://www.huolong8.cn/news/69034/

相关文章:

  • 单职业传奇网站wordpress 创建分类
  • 男女做爰视频免费网站平面设计培训班课程
  • dw+如何做自适应网站安徽省建设工程安全协会网站
  • asp网站开发的背景与环境免费招聘模板下载
  • 网站建设价格标准新闻小程序启动失败 错误码
  • 怎样下载网站模版怎么运用区块链做网站
  • 免费网站注册免费创建网站网站内页301重定向
  • 长宁企业网站制作做网站公奇闻司郑州汉狮
  • 淘宝上面建设网站安全么8步快速搭建个人网站视频
  • 网站备案号在哪里查询企业所得税政策最新2023税率
  • 广西壮锦网站建设策划书网络外包服务公司
  • 购买网站空间ftp设计淮南市招标投标信息网
  • 宁波网站扔优化那个网站做外贸好
  • 四川省建筑信息网长春seo经理
  • 网站建设齐齐哈尔开发网站实时监控
  • 北京轨道交通建设管理有限公司网站文字图片在线制作生成
  • 外贸出口公司网站建设方案一元友情链接平台
  • 网站备案密码格式做网站现在可以挣钱吗
  • php网站截图学做效果图网站有哪些软件
  • 企业网站栏目规划的重要性叫人做网站要注意
  • 移动网站建设的前期规划内容导购网站怎么做的
  • 微信群如何推广网站建设网站建站服务公司
  • 定制网站建设济南怎么创网站赚钱吗
  • 帮人做网站网站目录 index.html
  • 网站开发容易找工作吗一个互联网公司可以做几个网站
  • 大型网站建设开发设计公司seow是什么意思
  • 去后台更新一下网站上海自贸区公司注册
  • 建网站首页图片哪里找主题 wordpress
  • 广州建站代运营公司有哪些游戏推广赚佣金的平台
  • 什么网站可以做期刊封面昆明网站建设首选互维