Node 와 Python 의 양 방향 통신 실현 코드

제3자 데이터 공급 업 체 는 데 이 터 를 Python 과 함께 패키지 하면 Python 방법 을 호출 하여 데이터 조 회 를 실현 할 수 있 습 니 다.Node 를 통 해 간단하게 패키지 하여 Python 방법 을 호출 할 수 있다 면 빠 른 출시 와 개발 원 가 를 절약 할 수 있 습 니 다.
가장 간단 하고 거 친 통신 방식 은 Nodejs 가 Python 스 크 립 트 를 호출 한 다음 하위 프로 세 스 의 출력 을 가 져 오 는 것 입 니 다.그러나 매번 Python 이 시작 하고 패 킷 을 불 러 오 는 과정 이 길 기 때문에 이 과정 을 최적화 합 니 다.
프로 세 스 통신
index.py

#     Python  ,     
from mb import MB
#        
mbe.get('1.0.1.0')
index.js

const { spawn } = require('child_process');
const ls = spawn('python3', ['index.py']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code $[code]`);
});

child 통과 하기process.spawn 은 Python 하위 프로 세 스 를 파생 시 켜 stdout 출력 을 감청 합 니 다.상술 한 방식 도 공식 문서 의 예시 이다.현재 이 예시 에는 두 가지 문제 가 존재 한다.
Nodejs 가 Python 에 데 이 터 를 보 내지 않 았 습 니 다.
  • Nodejs 호출 이 완료 되면 Python 하위 프로 세 스 가 종 료 됩 니 다.다음 조 회 는 Python 명령 을 다시 호출 하여 파일 을 불 러 오고 데 이 터 를 조회 해 야 합 니 다.한 번 의 메모리 로드 를 실현 할 수 없습니다.여러 번 사용 합 니 다
  • 프로 세 스 양 방향 통신
    데이터 로드 를 한 번 보장 합 니 다.여러 번 사용 하 는 전 제 는 Python 프로 세 스 가 시 작 된 후에 종료 할 수 없습니다.Python 프로 세 스 가 종료 되 는 이 유 는 할 일이 없 기 때문에 흔히 볼 수 있 는 수단 은 순환,sleep,감청 포트 가 있 습 니 다.이 수단 들 은 동기 화 차단 작업,동기 화 비 차단 작업 으로 번역 할 수 있 습 니 다.그 중에서 가장 적은 대 가 는 동기 화 비 차단 작업 입 니 다.그리고 Linux 의 select,epoll 을 생각 할 수 있 습 니 다.Python 의 epoll 을 간단하게 검색 해 보 니 원생 가방 이 있 는 것 같 습 니 다.
    index.py-epoll 을 통 해 stdin 을 감청 합 니 다.
    
    import sys
    import fcntl
    import select
    from mb import MB
    import json
    
    mbe = MB('./data')
    
    # epoll   
    fd = sys.stdin.fileno()
    epoll = select.epoll()
    epoll.register(fd, select.EPOLLIN)
    
    try:
        while True:
            events = epoll.poll(10) #      
            data = ''
            for fileno, event in events:
                data += sys.stdin.readline() #           
                if data == '' or data == '
    ': continue items = xxx # for item in items: result = mbe.get(item) sys.stdout.write(json.dumps(result, ensure_ascii=False) +'
    ') # sys.stdout.flush() # finally: epoll.unregister(fd) epoll.close()
    index.js-stdin 을 통 해 데 이 터 를 보 냅 니 다.
    
    const child_process = require('child_process');
    const child = child_process.spawn('python3', ['./base.py']);
    
    let callbacks =  [], 
        chunks=Buffer.alloc(0), 
        chunkArr = [], 
        data = '', 
        onwork = false; // buffer       
        
    child.stdout.on('data', (chunk) => {
        chunkArr.push(chunk)
        if (onwork) return;
        onwork = true;
        while(chunkArr.length) {
            chunks = Buffer.concat([chunks, chunkArr.pop()]);
            const length = chunks.length;
            let trunkAt = -1;
            for(const [k, d] of chunks.entries()) {
                if (d == '0x0a') { // 0a   
                    data += chunks.slice(trunkAt+1, trunkAt=k);
                    const cb = callbacks.shift();
                    cb(null, data === 'null' ? null : data )
                    data = '';
                }
            }
            if (trunkAt < length) {
                chunks = chunks.slice(trunkAt+1)
            }
        }
        onwork = false;
    })
    
    setInterval(() => {
        if (callbacks.length) child.stdin.write(`
    `); // Nodejs flush , hack, python }, 500) exports.getMsg = function getMsg(ip, cb) { callbacks.push(cb) child.stdin.write(`${ip}
    `); // }
    Python 과 Nodejs 는 stdio 를 통 해 통신 을 실현 합 니 다.Python 은 epoll 감청 stdin 을 통 해 상주 메모리 가 장시간 실 행 됩 니 다.
    문제 가 있다
  • Nodejs 는 표준 출력 을 실행 결과 로 하기 때문에 Python 단 은 실행 결 과 를 표준 출력 에 기록 할 수 있 을 뿐 추가 인쇄 정보 가 있 을 수 없습니다
  • Nodejs 엔 드 표준 입력 은 flush 방법 이 없 기 때문에 Python 엔 드 이벤트 의 트리거 가 적절 하지 않 습 니 다.현재 Nodejs 엔 드 에서 정시 에 빈 정 보 를 보 내 hack 를 실현 합 니 다
  • Buffer 는 동적 으로 확대 할 수 없고 C 언어의 지침 이 없 으 면 사용 하기 쉽 습 니 다.stdout 을 해석 할 때 추 함 을 씁 니 다
  • 총결산
    Nodejs 와 Python 의 양 방향 통신 을 실현 할 수 있 지만 상기 여러 가지 문제 로 인해 이런 방식 을 추천 하지 않 습 니 다.HTTP 나 Socket 방식 을 통 해 이것 보다 훨씬 향 이 좋 습 니 다.
    Nodejs 와 Python 의 양 방향 통신 실현 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 Nodejs 와 Python 의 양 방향 통신 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기