Deno 利用 pooledMap 并行处理 http 请求

C 8月前 1368

注意:并行不等于多线程,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:\n\n${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));
        }
    }
);
最新回复 (2)
  • gaoyuyu 8月前
    2

    优化后的代码如下所示:

     

    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。

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

     

返回
发新帖