Deno 利用 pooledMap 并行处理 http 请求

注意:并行不等于多线程,Deno中目前创建多线程应用唯一的方式是Workers。

import { pooledMap } from "https://deno.land/std@0.198.0/async/pool.ts";



function web(request: Request): Response {

    console.log(request);

    console.log(new URL(request.url));

    const body = `Your user-agent is:

${request.headers.get("user-agent") ?? "Unknown"

        }`;

    return new Response(body, {

        status: 200,

    })

}



pooledMap(

    // Deno.listenTls({

    //     port: 8443,

    //     certFile: "localhost.crt",

    //     keyFile: "localhost.key",

    //     alpnProtocols: ["h2", "http/1.1"],

    // });

    window.navigator.hardwareConcurrency - 1,

    Deno.listen({ port: 8080 }),

    async (conn: Deno.Conn) => {

        for await (const event of Deno.serveHttp(conn)) {

            event.respondWith(web(event.request));

        }

    }

);
C

优化后的代码如下所示:

 

typescript

import { serve, Response, ServerRequest } from "https://deno.land/std/http/server.ts";

import { pooledMap } from "https://deno.land/std/async/pool.ts";

 

async function web(request: ServerRequest): Promise<Response> {

  console.log(request);

  console.log(new URL(request.url));

  const body = `Your user-agent is:\n\n${request.headers.get("user-agent") ?? "Unknown"}`;

  return {

    status: 200,

    body: body,

  };

}

 

const server = serve({ port: 8080 });

const concurrency = window.navigator.hardwareConcurrency - 1;

 

pooledMap(concurrency, server, async (req: ServerRequest) => {

  await req.respond(await web(req));

});

在这个优化的代码中,我主要进行了如下几个调整:

 

使用import语句引入了serve、Response和ServerRequest等需要的模块,以提高代码的可读性和模块化。

将原来的web函数修改为异步函数,并返回一个Promise对象。

使用serve函数启动服务器,并将其返回的对象存储在server变量中。

简化了原来的循环处理逻辑,使用await req.respond(await web(req))直接响应请求。

增加了concurrency变量来调整并发数,取window.navigator.hardwareConcurrency - 1。

简化了注释,使其更加简洁明了。

 

[em_11]

你们tql

1