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 에 데 이 터 를 보 내지 않 았 습 니 다.
데이터 로드 를 한 번 보장 합 니 다.여러 번 사용 하 는 전 제 는 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 의 양 방향 통신 을 실현 할 수 있 지만 상기 여러 가지 문제 로 인해 이런 방식 을 추천 하지 않 습 니 다.HTTP 나 Socket 방식 을 통 해 이것 보다 훨씬 향 이 좋 습 니 다.
Nodejs 와 Python 의 양 방향 통신 실현 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 Nodejs 와 Python 의 양 방향 통신 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
NestJs Guard하지만 가드는 ExcutionContext를 사용할 수 있기 때문에 다음에 어떠한 라우트 핸들러가 실행되는지 정확하게 알 수 있다. ExecutionContext는 ArgumentsHost를 상속 받았기 때문에 각 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.