간단하게 설명되는 웹용 VS 코드: 프로세스 간 통신

앞선 글에서 VS Code의 전체적인 코드 구조를 분석하여 VS Code가 Front End와 Back End를 분리하여 개발된다는 것을 배웠습니다. 그리고 프론트 엔드가 전자 기반이든 웹 기반이든, 백엔드 기반이 로컬이든 클라우드든 상관없이 호출 방식은 동일합니다.

이러한 아키텍처에서 프런트엔드와 백엔드 간의 통신 방법은 어떻게 구현됩니까? 이 기사에서는 VS Code For Web의 프로세스 간 통신 방법을 살펴봅니다.

프로세스 통신 및 호출 방법

IPC

다중 프로세스 아키텍처가 있는 프로젝트의 경우 프로세스 간 통신은 IPC(Inter Process Calling)를 통해 이루어집니다. VSCode는 통신을 실현하기 위해 특별한 IPC 모듈을 설계했습니다. 코드는 src/vs/base/parts/ipc 에 있습니다  .

export const enum RequestType {
    Promise = 100,
    PromiseCancel = 101,
    EventListen = 102,
    EventDispose = 103
}

enum 타입에서 VSCode의 IPC 모듈이 동시에 두 가지 호출 방식을 지원한다는 것을 알 수 있습니다. 하나는 Promise 호출을 기반으로 하고 다른 하나는 Event Emitter/Listener의 이벤트 모니터링 메커니즘을 통해 실현됩니다.

vscode-jsonrpc 이벤트 모니터링 메커니즘을 예로 들면 이 패키지는 VSCode에서 구현을 캡슐화하는 데 사용되며  호출 방법은 다음과 같습니다.

import * as cp from 'child_process';
import * as rpc from 'vscode-jsonrpc/node';

let childProcess = cp.spawn(...);

// Use stdin and stdout for communication:
let connection = rpc.createMessageConnection(
    new rpc.StreamMessageReader(childProcess.stdout),
    new rpc.StreamMessageWriter(childProcess.stdin));

let notification = new rpc.NotificationType<string, void>('testNotification');

connection.listen();

connection.sendNotification(notification, 'Hello World');

서버 호출도 비슷하게 래핑됩니다.

import * as rpc from 'vscode-jsonrpc/node';

let connection = rpc.createMessageConnection(
    new rpc.StreamMessageReader(process.stdin),
    new rpc.StreamMessageWriter(process.stdout));

let notification = new rpc.NotificationType<string, void>('testNotification');
connection.onNotification(notification, (param: string) => {
    console.log(param); // This prints Hello World
});

connection.listen();

프로세스 간 통신 단위

클라이언트와 서버 간의 point-to-point 통신을 구현하기 위해서는 메시지 호출 및 모니터링을 구현하기 위한 최소 단위가 필요합니다. VSCode에서 이 최소 단위는  Channel.

/**
 * An `IChannel` is an abstraction over a collection of commands.
 * You can `call` several commands on a channel, each taking at
 * most one single argument. A `call` always returns a promise
 * with at most one single return value.
 */
export interface IChannel {
    call<T>(command: string, arg?: any, cancellationToken?: CancellationToken): Promise<T>;
    listen<T>(event: string, arg?: any): Event<T>;
}

각 통신 프로세스에는 클라이언트와 서버가 동일한 서버에 있어야 합니다  Channel .

프로세스 간 통신

VSCode에서 클라이언트와 서버 간의 통신은 클래스를 통해 설정되며   연결은 Connection 클라이언트와 서버  Channel , 즉  ChannelClient 및를  전달하여 인스턴스화됩니다.ChannelServer

interface Connection<TContext> extends Client<TContext> {
    readonly channelServer: ChannelServer<TContext>;
    readonly channelClient: ChannelClient;
}

그들 사이의 차이점은 서버가 동시에 여러 클라이언트에 서비스를 제공할 수 있기 때문에 다중  Channel 획득을 지원하지만 ChannelClient 일대일 연결이라는 것입니다.

요약하면 VSCode에서 IPC 모듈의 기본 구조를 정리하고 프로세스 간의 통신 세부 사항을 이해했습니다.

그림을 사용하여 지식 포인트를 요약하고 분류합니다.

VSCode의 IPC 모듈은 자연스럽게 비동기 기능을 지원하기 때문에 프로세스가 로컬 프로세스인지 원격 프로세스인지 실제로 구분하지 않고 통신하는 한 프로세스 간  Channel 통신으로 간주할 수 있으며 동일한 코드를 재사용할 수 있습니다.

참고

VSCode의 공식 문서

VSCode API

VSCode 소스 코드의 해석--IPC 통신 메커니즘

Vscode 소스 코드 분석 - 프로세스 간 호출

 

추천

출처blog.csdn.net/weixin_47367099/article/details/127458777