2013-03-19 38 views
11

Tôi đang triển khai socket.io trong node.js cho dự án Windows Azure. Tôi phải gửi dữ liệu đến tất cả các khách hàng được kết nối theo các khoảng thời gian đều đặn.Đa luồng trong Node.js?

Tôi mới sử dụng node.js nhưng tôi đoán không thể đa luồng được. Mục đích của socket.io là hỗ trợ các ứng dụng thời gian thực, vì vậy có cách nào để tôi có thể gửi dữ liệu liên tục đến tất cả các máy khách được kết nối của tôi theo chu kỳ bình thường và cũng xử lý bất kỳ dữ liệu nào mà máy khách gửi đến máy chủ socket.io cùng một lúc không?

EDIT:

Đây là khoảng thực hiện socket.io tôi

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.emit('first', "connected"); 

    socket.on('clientData', function (data) { 
    //processing the data 
    }); 
}); 

function requestQueue() { 
// some processing 
io.sockets.emit('broadcast', recordsQueue); 
// should go to sleep for a time period 
} 

Về cơ bản tôi muốn phương pháp requestQueue được chạy liên tục như một chủ đề, mà sẽ phát ra dữ liệu cho khách hàng kết nối trong khoảng thời gian cụ thể. Và cũng có thể nếu khách hàng gửi bất kỳ dữ liệu nào đến sự kiện "clientData", thì tôi sẽ có thể nhận dữ liệu và xử lý nó.

Bất kỳ ý tưởng nào về cách tôi có thể làm điều đó?

Cảm ơn

Giải pháp của tôi:

var io = require('socket.io').listen(80); 

io.sockets.on('connection', function (socket) { 
    socket.emit('first', "connected"); 

    socket.on('clientData', function (data) { 
    //processing the data 
    }); 
}); 

function requestQueue() { 
var sleepTime = 0; 

// calcuate sleepTime 

io.sockets.emit('broadcast', recordsQueue); 

// should go to sleep for a time period 
    if(sleepTime !=0) 
    setTimeout(function() { requestQueue() }, sleepTime); 
} 

Trả lời

10

Như những người khác đã gợi ý, bạn có thể đạt được điều này bằng cách sử dụng các setInterval hoặc setTimeout chức năng định kỳ phát ra dữ liệu cho khách hàng được kết nối. Mặc dù mọi thứ chạy trong cùng một chuỗi điều khiển, tất cả các I/O được thực hiện không đồng bộ nên ứng dụng của bạn sẽ vẫn phản hồi. IE, mọi dữ liệu nhận được trong khi bộ hẹn giờ đang chạy sẽ được xếp hàng đợi và xử lý sau khi chức năng hẹn giờ trả về.

Xem Timers trong hướng dẫn sử dụng node.js để biết thêm thông tin.


Một lưu ý phụ, bạn sẽ muốn ứng dụng node.js tập trung xử lý I/O không đồng bộ trong thời gian thực gần như là sức mạnh của node.js. Nếu bạn cần phải làm bất kỳ tính toán nặng sau đó bạn sẽ muốn offload đó đến một thread/quá trình nào đó, bằng cách đơn giản làm cho một yêu cầu async cho kết quả.

+0

Cảm ơn mọi người đã trả lời! setInterval đã giải quyết vấn đề của tôi, nhưng có phương thức requestQueue của tôi thực hiện một số tính toán nặng và lo lắng rằng hiệu suất của các yêu cầu socket.io mà client tạo ra sẽ bị ảnh hưởng bởi nó. Tôi sẽ thực sự đánh giá cao nếu bạn có thể xây dựng một chút về lưu ý bên của bạn, có thể với một đoạn mã hoặc một số liên kết nếu có thể. Cảm ơn rất nhiều! – Bitsian

+0

Vâng, đây là sự cố định kỳ đối với các ứng dụng hoặc ứng dụng đơn luồng chỉ có một chuỗi duy nhất được dành riêng cho một tác vụ cụ thể. Ví dụ, các ứng dụng front-end của Windows chỉ có thể có một thread UI duy nhất, vì vậy bạn phải rất cẩn thận để đảm bảo rằng bất kỳ tính toán dài hạn nào được tải xuống một luồng/process/etc khác để tránh làm gián đoạn bơm thông báo GUI chính. Nút có một ràng buộc tương tự ở chỗ nó chỉ có một luồng thực thi duy nhất, mặc dù có thể có rất nhiều I/O không bị chặn vì công việc đó xảy ra độc lập với luồng thực thi. –

+0

Đây là câu hỏi SO về tính toán dài hạn trong nút có thể trợ giúp: http://stackoverflow.com/questions/3809165/long-running-computations-in-node-js –

11

Bạn đang phải, nút là đơn ren. Nhưng nó làm cho việc sử dụng nhiều sự kiện.

Chiến lược bạn nên thực hiện là lắng nghe các sự kiện trên kết nối, truy xuất dữ liệu và khi bạn muốn gửi lại dữ liệu, bạn làm điều đó vì một sự kiện khác đã được phát hành.

Nếu bạn xem các ví dụ trên frontpage socket.io, bạn sẽ thấy cách chúng sử dụng các sự kiện để bắt đầu xử lý luồng. Phương thức on (eventName, function) là cách bạn nghe cho một sự kiện trong NodeJS.

Nếu bạn muốn làm điều gì đó dựa trên thời gian (thường là ý tưởng tồi), hãy xem phương thức setInterval.

server

var io = require('socket.io').listen(80); 

    io.sockets.on('connection', function (socket) { 
     socket.emit('news', { hello: 'world' }); 
     socket.on('my other event', function (data) { 
     console.log(data); 
     }); 
    }); 

Khách hàng

<script src="/socket.io/socket.io.js"></script> 
    <script> 
     var socket = io.connect('http://localhost'); 
     socket.on('news', function (data) { 
     console.log(data); 
     socket.emit('my other event', { my: 'data' }); 
     }); 
    </script> 
+0

Bạn không chắc chắn nếu bạn có câu hỏi của mình đúng cách. Sai lầm của tôi mà tôi đã không khung nó đúng cách trước đây. Tôi đã cập nhật câu hỏi, vui lòng cho tôi biết nếu bạn có bất kỳ ý tưởng nào? – Bitsian

+0

Bạn có nhìn vào phương thức setInterval không? – ExxKA

+0

Cảm ơn bạn đã setInterval :) Upvoting – Bitsian

0

Logic bạn xác định bên trong setInterval, v.v.sẽ không hoạt động trong một chuỗi riêng biệt và cuối cùng là chặn chính. Giả sử có 1000 người dùng và bạn gọi setTimeout v.v. trong 1000 lần, cuối cùng họ sẽ chạy và dành thời gian quý giá đó. Chỉ các hoạt động IO cuối cùng là không chặn!

Bạn có thể xem xét điều tra nodeJX cho đa luồng trong Node.js

0

Đa luồng trong Node.js?

Có ..it là có thể trong nodejs sử dụng mô-đun NPM 'java4node', nó gói này một phương pháp là .multiThreading (nhiệm vụ, callbacks) Chức năng này là sử dụng cho thực hiện đa luồng trong java script cách

cho sử dụng liên kết này mô-đun : https://www.npmjs.com/package/java4node

chạy khen

NPM cài đặt java4node

var java = require('java4node') 

java.multiThreading({ 
      one: function(callback,parameters) { 
       console.log("function one is running independently"); 
       callback() 
      }, 
      two: function(callback,parameters) { 
       console.log("function two is running independently"); 
       callback() 
      }, 
      three: function(callback,parameters) { 
       console.log("function three is running independently"); 
       callback() 
      } 
     }, function(err, results) { 
      callback(err, results) 
     });