作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看了一些其他问题,但没有完全找到我想要的。我使用 Scala,但我的问题非常高,因此希望对任何语言都不可知。
常规场景:
Thread A
运行一个函数,并且有一些阻塞工作需要完成(比如一个 DB 调用)。 Async
块)导致某种“ worker ”Thread B
(在不同的池中)拿起 I/O 任务。 Thread A
中的方法完成返回一个 Future ,最终将包含结果和 Thread A
返回到其池中以快速接收另一个要处理的请求。 Thread B
如果/当 I/O 工作完成时,执行 I/O 工作的将运行回调函数(由线程 A 提供) - 这完成了
Future
有一些结果。
最佳答案
My understanding of non-blocking architectures is that the common approach is to still have some Thread waiting/blocking on the I/O work somewhere
Thread A is now off doing something else and has no association any more with the original request. How does the Result in the Future get sent back to the client socket?
Future
s,这真的取决于
ExecutionContext
.当您创建
Future
,工作在哪里完成取决于
ExecutionContext
.
val f: Future[?] = ???
val g: Future[?] = ???
f
和
g
立即创建,工作被提交到
ExecutionContext
中的任务队列中.在大多数情况下,我们无法保证哪个将实际执行或首先完成。你如何处理这些值(value)观很重要。显然,如果您使用
Await
等待完成
Future
s,然后我们阻塞当前线程。如果我们
map
他们并用这些值做一些事情,然后我们又需要另一个
ExecutionContext
将任务提交给。这为我们提供了一系列任务,每次我们操作
Future
时,这些任务都会异步提交并重新提交给执行程序以执行。 .
onComplete
在该链的末尾将该值返回给某个东西,无论是写入流还是其他东西。即,它可能不在原始线程的手中。
关于multithreading - 回调如何在非阻塞设计中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29303457/
我是一名优秀的程序员,十分优秀!