2012-10-24 2 views
0

웹 요청이 들어올 때마다 내 node.js 서버의 fifo에 쓰려고합니다. fifo를 작업 대기열로 사용하여 다른 프로그램에서 읽을 수 있습니다. 시간을 많이 소비하는 작업을 수행하십시오.fifo에서 node.js로 쓰기

지금까지이 같은 내 Node.js를 서버에 대해 코드를 가지고 :

Error: EEXIST, open '/tmp/myfifo' 

내가 잘못이 일을하고 있는가 :

이 코드가 실행
fs = require('fs'); 

... 

var fifoPath = '/tmp/myfifo'; 
var input = 'some input'; 
fs.open(fifoPath, 'wx', 0644, function(error, fd) { 
    if (error) { 
    if (fd) { 
     fs.close(fd); 
    } 
    console.log('Error opening fifo: ' + error); 
    return; 
    } 

    fs.write(fd, input, 0, input.length, null, function(error, written, buffer) { 
    if (fd) { 
     fs.close(fd); 
    } 
    if (error) { 
     console.log('Error writing to fifo: ' + error); 
    } else { 
     if (written == input.length) { 
     console.log('Input has been written successfully!'; 
     } else { 
     console.log('Error: Only wrote ' + written + ' out of ' + input.length + ' bytes to fifo.'); 
     } 
    } 
    }); 
}); 

, 그것은 다음과 같은 출력?

참고 : 입력이 FIFO에 순차적으로 쓰여지는지 확인하기 위해 'wx' 플래그와 함께 fs.open(...) 플래그를 사용하고 있습니다. 동시에 10 개의 요청이 들어올 때 동시에 모든 요청을 FIFO에 쓰는 것은 아닙니다.

답변

1

'x' 당신이 생각하는대로하지 않습니다. Node docs :

독점 모드 (O_EXCL)는 새로 생성 된 경로를 보장합니다. 해당 이름의 파일이 이미 존재하는 경우 fs.open()이 실패합니다.

독점 성이 필요한 상황은 무엇입니까? Nodejs는 단일 스레드이므로 2 개의 fs.write 호출이 인터리브되는 것은 불가능합니다. 둘 중 먼저 발생하는 것이 먼저 작성됩니다.

+0

독점 모드에 대해 지적 해 주셔서 감사합니다. fs.write가 인터리브되어있는 경우 두 개의 웹 요청이 동시에 들어 오면'fs.open (...) '이 두 번 호출되지 않습니까? 그렇다면 그들 각각은'fs.write (...)'를 호출 할 것이고 이것은'fs.write (...)'호출이 비동기이기 때문에 동시에 실행될 것입니다. 아니면 제가 빠진 것이 있습니까? fs.open()은 하나의 요청에 대해서만 성공할 것이며, 쓰는 동안 다른 요청은 파일을 열 수 없다고 말하고 있습니까? – Addison