我对反应式 API 比较陌生,并且很好奇当我们从 Web 控制器返回 Flux 时幕后发生了什么。
根据 spring-web 文档
响应式返回值的处理方式如下:
适应单值 Promise,类似于使用 DeferredResult。示例包括 Mono (Reactor) 或 Single (RxJava)。
适配流媒体类型(如application/stream+json或text/event-stream)的多值流,类似于使用ResponseBodyEmitter或SseEmitter。示例包括 Flux (Reactor) 或 Observable (RxJava)。应用程序还可以返回 Flux 或 Observable。
与任何其他媒体类型(例如 application/json)的多值流进行适配,类似于使用
DeferredResult<List<?>>.
我创建了两个 API,如下所示:
@GetMapping("/async-deferredresult")
public DeferredResult<List<String>> handleReqDefResult(Model model) {
LOGGER.info("Received async-deferredresult request");
DeferredResult<List<String>> output = new DeferredResult<>();
ForkJoinPool.commonPool().submit(() -> {
LOGGER.info("Processing in separate thread");
List<String> list = new ArrayList<>();
for (int i = 0; i < 10000 ; i++) {
list.add(String.valueOf(i));
}
output.setResult(list);
});
LOGGER.info("servlet thread freed");
return output; …Run Code Online (Sandbox Code Playgroud) 以下代码用于打印2线程linux的进程id(ubuntu 14.04)
#include<pthread.h>
#include<stdio.h>
#include <unistd.h>
void* thread_function (void* arg)
{
fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
/* Spin forever. */
while (1);
return NULL;
}
int main ()
{
pthread_t thread;
fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
pthread_create (&thread, NULL, &thread_function, NULL);
/* Spin forever. */
while (1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是
main thread pid is 3614
child thread pid is 3614
Run Code Online (Sandbox Code Playgroud)
但是不应该是因为GNU/Linux的进程id不同,线程是作为进程实现的?