簡體   English   中英

如何將非常大的圖像從 python 腳本傳輸到 NodeJS 而不會導致節點應用程序(電子)中的延遲

[英]How to transfer very large images from a python script to NodeJS without causing lag within the node app (electron)

我正在從事一個項目,該項目涉及從 python 腳本中抓取圖片(python 通過調用 c 函數與相機交互)。 我目前遇到的問題是,當第一次收到消息時,使用 socket.io 將圖像發送到 javascript 應用程序會導致大量延遲(大約 3 秒的暫停)。 每個圖像大約 15mb,發送時為 png 格式。 將這些圖像從 python 腳本傳輸到 node-js 應用程序的最有效方法是什么,沒有延遲或延遲很小(不是發送延遲,而是接收時應用程序延遲)? 我目前處理這個的方式是這樣的:

socket.on("frame", data => {});

即使對接收到的數據不做任何處理,應用程序仍然會延遲/凍結 3 秒。 如果有幫助的話,python 腳本和電子應用程序可能會安裝在同一台機器上......

首先,確保 socket.io 以binary模式運行,這樣您就不會以任何可能使其變大或使傳輸處理速度變慢的方式對圖像數據進行編碼。

然后,查看在傳輸期間是否可以從 Python 和 JS 進程中獲取有關 CPU 使用率的任何信息,以查看其中一個進程是否過度占用 CPU。 node.js 中正確完成的 I/O 代碼應該完全是事件驅動的,並且(如果您沒有對傳入的數據進行任何耗時的處理)不應該僅僅從套接字讀取字節就占用太多 CPU。

你讓我發布我的測試應用程序的代碼,它在 106 毫秒內發送一個 65MB 的圖像。 所以,在這里。 這是兩個應用程序,一個發送,一個偵聽傳入的 TCP 連接並接收。 發送應用程序將文件名作為命令行參數。 它所做的只是連接到本地服務器並將整個文件發送到服務器,然后關閉。 因此,每個 TCP 連接都針對一個文件。 由於這只是一個測試工具,因此錯誤處理最少。

這是發送應用程序:

const net = require('net');
const process = require('process');
const fs = require('fs');

let imgFile = process.argv[2];

const port = 3000;
const host = "localhost";

const socket = net.connect(port, host, () => {
    console.log(`connect to ${host} on ${port} succeeded`);
    const stream = fs.createReadStream(imgFile);
    let cnt = 0;
    stream.on('data', (buffer) => {
        cnt += buffer.length;
        if (!socket.write(buffer)) {
            stream.pause();
            socket.once('drain', () => {
                stream.resume();
            });
        }
    }).on('error', (err) => {
        console.log(err);
    }).on('end', () => {
        console.log(`image sent ${cnt} bytes, ${Math.round(cnt/1024)}KB`);
        socket.end();
    });
});

而且,這是接收應用程序:

const net = require('net');

let server = net.createServer(socket => {
    let start = Date.now();
    let cnt = 0;
    console.log("received connection")
    // socket.setEncoding('binary');
    socket.on('data', buffer => {
        // do nothing with the data
        cnt += buffer.length;
    }).on('end', () => {
        console.log(`got ${cnt} bytes, ${Math.round(cnt/1024)}KB`);
        console.log(`Took ${Date.now() - start} ms` )
    }).on('error', e => {
        console.log(e);
    });
});

server.listen(3000);

這兩個應用程序都只是發送和接收二進制數據(不涉及編碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM