Quy trình NodeJS

Nút. js được xây dựng bằng chương trình C++ với công cụ V8 được nhúng trong đó để cung cấp môi trường thực thi JavaScript bên ngoài trình duyệt. Nhiều phương thức toàn cầu có thể truy cập thực sự là các trình bao bọc xung quanh các phương thức thực hiện lệnh gọi đến các thư viện C cốt lõi

Nút. js có nhiều số nhận dạng toàn cầu được xây dựng sẵn có sẵn và được các nhà phát triển biết đến. Ngoài ra còn có một số có thể truy cập ở cấp mô-đun thông qua kế thừa mô-đun

Rất ít các đối tượng toàn cầu là

  • toàn cầu - Đó là một không gian tên và có thể truy cập được trên ứng dụng. Đặt một thuộc tính cho không gian tên này giúp nó có thể truy cập được trong suốt quá trình đang chạy
  • quy trình - Quy trình là một mô-đun cung cấp tương tác với Nút hiện tại. quy trình js
  • bảng điều khiển - Bảng điều khiển là mô-đun chủ yếu được sử dụng để ghi thông tin hoặc lỗi. Nó kết thúc chức năng STDIO của một quy trình
  • setTimeout(), clearTimeout(), setInterval(), clearInterval() - Tất cả những thứ này có thể được phân loại thành các hàm hẹn giờ

Một số hạt có thể truy cập thông qua kế thừa mô-đun là mô-đun, xuất, __filename, __dirname, require(), v.v.

Trong bài viết này, chúng tôi cố gắng hiểu thêm về đối tượng 'quy trình' và các chi tiết của nó với các ví dụ. Đối tượng 'tiến trình' là một đối tượng toàn cầu, là một thể hiện của EventEmitter và có thể được truy cập trực tiếp. Nó cũng có thể được truy cập rõ ràng bằng cách sử dụng mô-đun toàn cầu i. e. yêu cầu

const process = require(‘process’);

đối tượng process có một thuộc tính 'argv' là một mảng chứa các thuộc tính được truyền cho node process

Tạo một chỉ mục đơn giản. js và cho phép bảng điều khiển. đăng nhập quá trình. argv

bảng điều khiển. nhật ký (quá trình. argv)

Nhập vào 'chỉ mục nút. js' trong thiết bị đầu cuối. Khi nhấn Enter, đầu ra sau sẽ được cung cấp

[
  '/Users/***/.nvm/versions/node/v12.20.1/bin/node',
  '/Users/***/index.js'
]

Bây giờ, hãy chuyển vào một số tham số khác và bạn sẽ thấy các tham số được hiển thị với nội dung 'chỉ mục nút. kiểm tra js'.
Cũng lưu ý rằng quy trình có 'quy trình. thiết bị xuất chuẩn' và 'quá trình. stderr’ giúp chúng tôi gửi thông báo đến kênh đầu ra tiêu chuẩn và kênh lỗi tiêu chuẩn nếu có bất kỳ lỗi nào.
Thực ra, bảng điều khiển. nhật ký đang thực hiện quy trình nội bộ. tiêu chuẩn. viết (tin nhắn + '\ n').
bảng điều khiển. log(‘Xin chào thế giới’) giống như quy trình. tiêu chuẩn. write(‘Xin chào thế giới’ + ‘\n’).
Tệp có thể được đọc dưới dạng luồng và chúng tôi có thể xử lý tệp này. tiêu chuẩn. Ví dụ: thay thế nội dung của chỉ mục. js với đoạn mã dưới đây.

var fs = require('fs')
fs.createReadStream(__filename).pipe(process.stdout);

Chạy 'chỉ mục nút. js' sẽ hiển thị nội dung của tệp.  

Một điều thú vị khác về Node. js là khi nó hoàn thành hoặc không còn gì để làm, thì nó sẽ thoát ra khỏi quy trình. Hãy hiểu điều này với một ví dụ

setTimeout(() => { 
process.stdout.write('Executed after 1000 ms' + '\n'); 
}, 1000)

Cái này sẽ đợi trong 1 giây và sau đó xuất ra 'Đã thực hiện sau 1000 ms' và kết thúc quá trình

Nếu chúng tôi muốn quá trình chạy mãi mãi, thì chúng tôi có thể thay thế setTimeout bằng setInterval sẽ thực hiện gọi lại mỗi lần, đăng khoảng thời gian. Và cách duy nhất để thoát là nhấn 'Ctrl + C' hoặc quá trình bị lỗi

Để xem nhanh các thuộc tính, phương thức và sự kiện trên đối tượng quy trình, hãy thêm 'bàn điều khiển. nhật ký (quy trình)' trong chỉ mục. js và chạy chỉ mục nút. js. Hầu hết trong số họ là tự giải thích theo tên của họ

version: 'v12.20.1', //current version of node 
versions: {…}, // gives insight about the node and its core components like V8 engine version 
arch: 'x64', 
platform: 'darwin', 
release: {…}, // details of node source and version of lts. 
moduleLoadList: [...], // details of modules available with node. 
binding: [Function: binding], 
_events: [Object: null prototype] {  
newListener: [Function: startListeningIfSignal], // whenever a new listener is added  
removeListener: [Function: stopListeningIfSignal], // existing listener is removed  
warning: [Function: onWarning],  
 SIGWINCH: [Function]  
},  
_eventsCount: 4,  
_maxListeners: undefined,  
domain: null,  
_exiting: false,  
config: {  
target_defaults: {…},  
variables: {...}  
},  
cpuUsage: [Function: cpuUsage],  
resourceUsage: [Function: resourceUsage],  
memoryUsage: [Function: memoryUsage],  
kill: [Function: kill],  
exit: [Function: exit],  
openStdin: [Function],  
getuid: [Function: getuid],  
geteuid: [Function: geteuid],  
getgid: [Function: getgid],  
getegid: [Function: getegid],  
getgroups: [Function: getgroups],  
allowedNodeEnvironmentFlags: [Getter/Setter],  
assert: [Function: deprecated],  
features: {…},  
setUncaughtExceptionCaptureCallback: [Function: setUncaughtExceptionCaptureCallback],  
hasUncaughtExceptionCaptureCallback: [Function: hasUncaughtExceptionCaptureCallback],  
emitWarning: [Function: emitWarning],  
nextTick: [Function: nextTick],  
stdout: [Getter],  
stdin: [Getter],  
stderr: [Getter],  
abort: [Function: abort],  
umask: [Function: wrappedUmask],  
chdir: [Function: wrappedChdir],  
cwd: [Function: wrappedCwd],  
initgroups: [Function: initgroups],  
setgroups: [Function: setgroups],  
setegid: [Function],  
seteuid: [Function], 
setgid: [Function], 
setuid: [Function], 
env: {…}, // environment details for the node application 
title: 'node', 
argv: [  
   '/Users/srgada/.nvm/versions/node/v12.20.1/bin/node', 
    '/Users/srgada/index.js' 
 ], 
execArgv: [], 
pid: 29708, 
ppid: 19496, 
execPath: '/Users/srgada/.nvm/versions/node/v12.20.1/bin/node', 
debugPort: 9229, 
argv0: 'node', 
mainModule: Module {…} //details of the main starting file or module. This is deprecated in latest one and use require.main instead
 }

Chúng ta hãy xem xét một số thuộc tính được sử dụng hoặc yêu cầu nhiều nhất

  • pid – cung cấp id quá trình
  • nền tảng – là linux hoặc darwin
  • phiên bản – phiên bản nút
  • title – tên process, mặc định là node và có thể thay đổi
  • execPath - cho đường dẫn quy trình thực thi
  • argv - đối số được thông qua

Một số phương pháp phổ biến là

  • thoát - thoát khỏi quy trình và chấp nhận mã thoát làm đối số.  
  • cwd – để lấy thư mục làm việc hiện tại và để thay đổi, chúng ta có thể sử dụng ‘chdir’.  
  • nextTick – như tên gợi ý, nó đặt lệnh gọi lại được chuyển đến chức năng này trong lần lặp lại tiếp theo của vòng lặp sự kiện. Nó khác với setTimeout với độ trễ 0 ms
process.nextTick(() => {  
   console.log('Got triggered in the next iteration of event loop');  
});  
setTimeout(() => {  
   console.log("Even after nextTick is executed");  
}, 0);  
console.log("First text to be printed"); 

đầu ra.  

First text to be printed  
Got triggered in the next iteration of event loop  
Executed after some delay

SỰ KIỆN.
Để ghi nhật ký (hoặc) thực hiện bất kỳ thao tác dọn dẹp nào trước khi thoát khỏi quy trình, chúng ta có thể nối với sự kiện 'exit' được đưa ra khi quy trình. thoát được gọi.

console.log(process.argv);
process.on('exit', () => {  
   console.log('Perform any clean up like saving or releasing any memory');  
});

Thoát được kích hoạt sau khi vòng lặp sự kiện kết thúc. Do đó, chúng tôi không thể thực hiện bất kỳ công việc không đồng bộ nào trong trình xử lý. Vì vậy, nếu bạn muốn thực hiện một số lệnh gọi như lưu nội dung vào db, chúng ta có thể nối với 'beforeExit' khi quá trình này kết thúc

________số 8

Một sự kiện khác 'uncaughtException', như tên gợi ý, được đưa ra khi có một ngoại lệ chưa được xử lý trong ứng dụng. Bất cứ khi nào một ngoại lệ chưa được xử lý được tìm thấy, Node. ứng dụng js ghi nhật ký tăng và thoát ngăn xếp

process.on('exit', () => {  
    console.log('Perform any clean up like saving or releasing any memory');  
});  
process.on('uncaughtException', (err) => {  
    console.error('An unhandled exception is raised. Look at stack for more details');  
    console.error(err.stack);
    process.exit(1);
});
var test = {};  
//raises an exception.  
test.unKnownObject.toString();

đầu ra

[
  '/Users/***/.nvm/versions/node/v12.20.1/bin/node',
  '/Users/***/index.js'
]
0

Tương tự như 'uncaughtException', một khái niệm mới hơn được gọi là lỗi unhandledRejection được giới thiệu. Điều này được nêu ra nếu một lời hứa bị từ chối và không có người xử lý phản hồi

Trong cả hai trường hợp, ứng dụng sẽ bị sập và không nên tiếp tục. Một lý do có thể là ứng dụng có thể ở trạng thái không xác định. Nếu bạn đang thắc mắc tại sao ai đó sẽ móc vào sự kiện này, thì đó là để thực hiện dọn dẹp đồng bộ các tài nguyên được phân bổ (e. g. mô tả tệp, xử lý, v.v.) trước khi tắt quy trình

Ghi chú. Sự kiện 'beforeExit' không được kích hoạt khi có 'uncaughtException' hoặc quá trình. thoát được gọi một cách rõ ràng

Sự kiện tín hiệu. Các sự kiện do hệ điều hành phát ra cho Node. js được gọi là tín hiệu. Phổ biến nhất trong số đó là SIGTERM và SIGINT. Cả hai đều liên quan đến việc chấm dứt quá trình. Tín hiệu không có sẵn cho chuỗi công nhân. Hãy xem xét một ví dụ cho SIGINT

[
  '/Users/***/.nvm/versions/node/v12.20.1/bin/node',
  '/Users/***/index.js'
]
1

Trong thiết bị đầu cuối, thực hiện chỉ mục nút. js. Đây sẽ là một quá trình liên tục mà không có bất kỳ tiêu chí thoát nào vì setInterval.  

Nhấn Ctrl+C, kết quả là sự kiện 'SIGINT' được nâng lên ứng dụng nút và được ghi lại trong trình xử lý. Vì quy trình. lệnh thoát trong trình xử lý, quá trình thoát

Nút. js là một tiến trình đơn luồng. Và trong một số trường hợp, bạn có thể muốn một số logic cụ thể được chạy trong tiến trình con chứ không phải trong tiến trình chính, để nếu có bất kỳ sự cố nào xảy ra thì tiến trình chính vẫn hoạt động

Lấy ví dụ trước về hiển thị nội dung của chỉ mục. js, hãy thực hiện lần này với sự trợ giúp của mô-đun ‘child_ process’

[
  '/Users/***/.nvm/versions/node/v12.20.1/bin/node',
  '/Users/***/index.js'
]
2

Ghi chú. cat là một tệp nhị phân có sẵn trên iOS. Điều này có thể thay đổi dựa trên hệ điều hành của bạn.
 'spawn' trên quy trình con tương tự như exec nhưng nó cung cấp quyền kiểm soát chi tiết hơn về cách các quy trình được thực thi.
Hãy tách một tiến trình con ra khỏi tiến trình cha và truyền dữ liệu từ tiến trình con này sang tiến trình con khác.

[
  '/Users/***/.nvm/versions/node/v12.20.1/bin/node',
  '/Users/***/index.js'
]
3

Tổng quan

  • Tại dòng 6, spawn được cung cấp tiến trình để thực thi và tham số thứ hai là tham số được truyền cho nó
  • Vì chúng tôi muốn loại bỏ một quy trình nút khác, chúng tôi dựa vào 'quy trình. execPath'
  • '__filename' là tên của tệp tôi. e. mục lục. js và đối số thứ hai là 'childProcess'
  • Khi quá trình con được sinh ra [như chỉ mục nút. js childProcess], điều kiện ở dòng 2 được thỏa mãn và gửi dữ liệu đến quy trình cha
  • Quá trình cha nắm bắt thiết bị xuất chuẩn của thiết bị xuất chuẩn con trên sự kiện thay đổi dữ liệu và in tương tự trong thiết bị xuất chuẩn

đầu ra.  

[
  '/Users/***/.nvm/versions/node/v12.20.1/bin/node',
  '/Users/***/index.js'
]
4

Như chúng ta đã biết trước đó, tất cả thiết bị xuất chuẩn là một luồng và chúng ta có thể tạo đường dẫn con. stdout cho phụ huynh. thiết bị xuất chuẩn trực tiếp thay vì lắng nghe sự kiện thay đổi dữ liệu.  

Thay dòng 7,8,9 bằng cái này

[
  '/Users/***/.nvm/versions/node/v12.20.1/bin/node',
  '/Users/***/index.js'
]
5

Một phiên bản tốc ký khác là cung cấp các tham số thứ 3 cho lần sinh sản mà không cần đường ống như hình bên dưới. [về cơ bản, nó kế thừa allstdio từ cha mẹ và thực hiện đường dẫn cho bạn]

[
  '/Users/***/.nvm/versions/node/v12.20.1/bin/node',
  '/Users/***/index.js'
]
6

Lưu ý rằng, mỗi tiến trình con là khép kín và dữ liệu không được chia sẻ giữa nhiều tiến trình con hoặc tiến trình cha.

Điều gì sẽ xảy ra nếu bạn muốn chuyển dữ liệu hoặc kiểm soát quy trình con như chấm dứt nếu cần?

Tham số thứ ba của spawn chứa stdio về cơ bản là một mảng với stdIn, stdOut và stdErr. Truyền null sẽ lấy giá trị mặc định. Chúng ta có thể chuyển vào mục thứ tư 'ống' giúp gửi dữ liệu từ tiến trình con

[
  '/Users/***/.nvm/versions/node/v12.20.1/bin/node',
  '/Users/***/index.js'
]
7

Từ đoạn mã trên, chúng ta có thể thấy rằng con tạo một ổ cắm với cha mẹ và gửi dữ liệu. Phụ huynh đang lắng nghe nó và thực hiện thao tác được yêu cầu. e. chấm dứt tiến trình con

Phần kết luận

Nút. js là một hiệu suất đơn luồng, không chặn và hoạt động tốt cho một quy trình. Nhưng nếu chúng ta muốn mở rộng quy mô và có một ứng dụng phân tán thì sao? . Để khắc phục điều này, Node. js phải hoạt động với nhiều quy trình và thậm chí trên nhiều máy

Quy trình trong NodeJS là gì?

Đối tượng process trong Node. js là một đối tượng toàn cầu có thể được truy cập bên trong bất kỳ mô-đun nào mà không yêu cầu nó . Có rất ít đối tượng hoặc thuộc tính toàn cầu được cung cấp trong Node. js và process là một trong số đó. Nó là một thành phần thiết yếu trong Node.

Biến quy trình trong NodeJS là gì?

Trong nút. js, quy trình. env là biến toàn cục được đưa vào trong thời gian chạy . Nó là một cái nhìn về trạng thái của các biến môi trường hệ thống. Khi chúng tôi đặt một biến môi trường, nó sẽ được tải vào quy trình.

Làm cách nào để sử dụng process env trong NodeJS?

Bạn có thể truy cập các biến môi trường trong Node. js ngay lập tức. Khi nút của bạn. js khởi động, nó sẽ tự động cung cấp quyền truy cập vào tất cả các biến môi trường hiện có bằng cách tạo đối tượng env trong đối tượng chung của quy trình .

Quá trình đánh dấu trong NodeJS là gì?

Khi ở trong Node JS, một lần lặp của vòng lặp sự kiện đã hoàn tất . Điều này được gọi là đánh dấu. tiến trình. nextTick() nhận chức năng gọi lại được thực thi sau khi hoàn thành lần lặp/đánh dấu hiện tại của vòng lặp sự kiện. Các giai đoạn của Vòng lặp sự kiện trong Node JS từ nodejs. tổ chức.