Кластер с Express и Socket.io - PullRequest
0 голосов
/ 26 мая 2020

У меня проблема. Я разрабатываю сервер для получения .jpg от raspberry через WebSockets. Итак, я создаю сценарий для получения и отправки данных с OpenCV и Socket.io. Код показан ниже:

import cv2
import socketio
import time 

camera = cv2.VideoCapture(0)  # init the camera

# change the resolution of camera

socket = socketio.Client()
socket.connect('http://127.0.0.1:3000')

HEIGHT = 640
WIDTH = 480

FPS = 20

while True:
    try:
        _, frame = camera.read()  # grab the current frame
        frame = cv2.resize(frame, (HEIGHT, WIDTH)) 
        gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
        _, binary = cv2.imencode('.jpg', frame,[cv2.IMWRITE_JPEG_QUALITY,20])
        socket.emit('send-frame', binary.tobytes())
        time.sleep(1/FPS)
    except KeyboardInterrupt:
        break

socket.disconnect()
camera.release()

На сервере, который я использовал:

const express = require('express')
const path = require('path')

const app = express()
const server = require('http').Server(app)
const io = require('socket.io')(server)
const PORT = 3000

app.use(express.static(path.join(__dirname, './public')))

let sendVideo = false
const listCameras = []

const query = camera => camera === data

io.on("connection", socket => {

    // socket.on('available-cameras', data => {
    //     console.log(data)
    //     const existingCameras = listCameras.find(query)
    //     if(!existingCameras)
    //         listCameras.push(data.place)
    // })

    socket.on('get-video', enableVideo => {
        sendVideo = enableVideo
    })

    socket.on("send-frame", data => {
        if(sendVideo === true){
            socket.broadcast.compress(true).emit('frame', data)
        }
    }) 
})

server.listen(PORT,'127.0.0.1', () => {
    console.log('Listening on', PORT)
})

Чтобы повысить производительность, я увидел, что модуль кластера может разделить обязанности между доступными ядрами на P C. Итак, я разрабатываю код:

const cluster = require('cluster')
const numCPUs = require('os').cpus().length


if(cluster.isMaster){
    for (let i=0; i < numCPUs; i++){
        cluster.fork()
    }

    cluster.on('exit', (worker, code, signal) => {
        console.log('worker ' + worker.process.pid + ' died')
    })
} else {
    require("./server.js")
}

Но после этого я запускаю кластер. js, и я не получаю изображения на своей веб-странице. Как я могу решить эту проблему ? Заранее спасибо.

Пока не забыл, индекс. js код:

const socket = io.connect("localhost:3000")


// Receving the frames
socket.on("frame", data => {
    console.log('data')
    let base64String = btoa(String.fromCharCode(...new Uint8Array(data)))
    camera.src = `data:image/png;base64,${base64String}`

})
...