在异步编程方面,这可能是一个非常基本的问题,但我试着阅读它,却找不到相应的资源。
假设:--关于异步编程的一般想法:
当我们启动阻塞操作(网络调用,从DB/file中读取)时,我们可以将其委托给内核线程,这将使我们的应用程序线程对其他作业保持免费。内核线程等待作业完成,并在任务完成时对应用程序线程进行回调。
Coroutines :,我最近几天一直在读关于Kotlin的文章。我认为,概念明智的协同是语言不可知论。我一直在问的问题是:
suspension
和continuation
是如何为共同例程而发生的。Coroutines不是线程(OS给出处理器的一部分),它们是tasks
,它将被调度在要执行的线程上。
世卫组织一直在寻找执行中的程序,并说,这个协同线已经到达一个暂停点,它应该从线程中取出。另一个需要从continuation
恢复的协同线应该安排在线程上。至于我所读到的关于Java Fibers
的文章,它将由一个Fiber Scheduler
来完成,这类似于Kotlin吗?
提前感谢你的帮助。
发布于 2019-05-24 15:56:19
Coroutine悬架是完全明确和一流的。当您调用suspendCoroutine()
或suspendCancellableCoroutine()
,传入作为参数接收延续的块时,就会发生这种情况。
这个块可以对延续对象做它想做的任何事情,当某个人在某个地方调用continuation.resume(resultValue()
时,它就会恢复。它恢复的线程最初是调用resume()
的线程,但是resume
内部的逻辑立即委托给负责的调度程序,后者通常会将恢复提交给另一个线程或线程池。
调度程序逻辑也是一流的,您可以编写自己的调度程序。但是,这几乎从来不需要,因为只有少数几种有意义的方法可以做到,而Kotlin已经支持它们了。
您还可以查看一个concrete example in code,它演示了suspendCoroutine
和coroutine.resume()
的裸露用法,而不需要Dispatcher添加到其中的层。
顺便说一句,你从不把阻塞操作委托给“内核线程”,使它们成为非阻塞的。异步操作不会阻塞任何线程。例如,在较低的级别上,有一个选择器的机制,当事件完成时接收来自IO操作的事件。它的工作原理非常类似于GUI线程中的事件循环。
https://stackoverflow.com/questions/56289112
复制相似问题