什么是进程间通信?
进程(Process)指正在运行中的程序,进程间通信(IPC,Inter-Process Communication)是指不同进程之间相互传递消息或信息的机制。在计算机领域中,进程间通信是多个程序协同工作的基础,其中包括一些前端开发中使用到的场景。例如,在 Web Worker 中运行 JavaScript 程序时通常需要与主线程进行通信;而通过进程间通信可以在 Deno 环境下运行多个独立的脚本,并实现它们之间的数据交换与互动。
在 Deno 中如何实现进程间通信?
Deno 应用程序可以通过 IPC 模块实现进程间通信。IPC 模块提供了两种方式,一种是基于 Unix 域套接字(Unix Domain Socket),另一种是基于管道(Pipe)。在这两种方式中,我们将着重介绍基于 Unix 域套接字的方法。
1. 创建 Unix 域套接字
在建立进程间通信之前,我们需要创建 Unix 域套接字。可以通过 Import “deno” 自带的 UnixSocket 类来实现创建。
// javascriptcn.com 代码示例 // server.ts import { listen, connect } from "net"; import { UnixSocket } from "deno"; const socketPath = "/tmp/deno.sock"; const server = listen({ port: socketPath, transport: "unix" }); console.log("socket listening on", socketPath);
在上述代码中,我们调用了 listen
方法,并指定了一个 Unix 域套接字的路径。
2. 创建客户端并连接到服务器
创建客户端并连接到服务器,可以通过 connect
方法来实现:
// client.ts import { connect } from "deno"; const socketPath = "/tmp/deno.sock"; const conn = await connect({ transport: "unix", path: socketPath });
3. 进行消息传递
当服务器与客户端成功建立连接后,我们就可以进行消息传递。传递的消息必须是符合格式的二进制数据。
// javascriptcn.com 代码示例 // server.ts import { listen, connect } from "net"; import { UnixSocket } from "deno"; interface Message { action: string; data: any; } const handleMessage = (msg: Message) => { console.log(`Received message with action "${msg.action}" and data:\n`, msg.data); }; for await (const conn of server) { const decoder = new TextDecoder(); const buf = new Uint8Array(1024); await conn.read(buf); // read incoming data const data = JSON.parse(decoder.decode(buf)); handleMessage(data); conn.write(new TextEncoder().encode("Message received.")); }
// javascriptcn.com 代码示例 // client.ts import { connect } from "deno"; interface Message { action: string; data: unknown; // ignore type checking for simplicity } const socketPath = "/tmp/deno.sock"; const conn = await connect({ transport: "unix", path: socketPath }); const message: Message = { action: "greet", data: { name: "Tom" }, }; const encoder = new TextEncoder(); const buf = encoder.encode(JSON.stringify(message)); await conn.write(buf); const decoder = new TextDecoder(); const respBuf = new Uint8Array(1024); await conn.read(respBuf); console.log(decoder.decode(respBuf));
在上述代码中,我们向服务端发送了一个消息,并等待返回结果。
总结
通过基于 Unix 域套接字的方式,我们可以在 Deno 中实现进程间通信。使用 IPC 模块中的 listen
和 connect
方法来创建套接字和连接,并通过二进制序列化和反序列化来传递消息。这为运行独立的脚本提供了一种交互和通信的机制。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652918ad7d4982a6ebba8d3d