JS理论:调用栈、事件循环、消息队列(也叫任务队和回调队列)、作业队列(微任务队列)...

本文深入解析JavaScript的执行原理,包括调用栈、事件循环、消息队列和工作任务的概念及运行机制,帮助读者理解JS异步编程的基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:调用栈是个什么鬼东西,它具有栈的属性--后进先出
先看一段简单的JS代码:
const second = function(){
console.log('hello there');
}
const first = function() {
console.log('hi,first');
second();
}
console.log('The Start');//直接输出就是直接进栈,执行完后 出栈
first();//方法先进栈,执行完内部程序,最后出栈
console.log('The End');

1088849-20181210113717721-983184709.png

二:事件循环又是何方妖孽?
形象来说,他和调用栈一样存放的都是要执行的程序。不同的是,只有调用栈里面的才会被执行。
所以,事件循环回去判断调用栈里面的事件是否为为空,就是执行完了没?要是执行完了,就有坑位,事件循环里面的事件就会塞入调用栈。

三:消息队列
消息队列里面放的是一些待触发执行的方法,如点击事件,当触发之后,会被通知主线程去执行
(为什么只能去主线执行?因为JS是单线程的,只有在主线程上面的才能被执行,消息队列就是不在主线程,消息队列里面的想被执行只能去通知主线程)

四:工作任务
他的里面执行的方法优先级高于消息队列里面的回调函数
console.log('The Start');//工作任务
const first = function() {
setTimeout(function (){
console.log('hi,first')//消息队列里面的回调函数
},0)
}
first();
console.log('The End');//工作任务
执行结果为:
The Start
The End
hi,first

转载于:https://www.cnblogs.com/lelexiu/p/10095718.html

Martinet 是分布式任务管理工具。 Martinet 数据库后端,基于 zeroMQ 的分布式任务管理系统。Martinet 可以使用任意的 sequelize.js 兼容的数据库(默认是 SQLite)。 Martinet 使用 push-pull 管理模式来确保在分布式的环境下高效的运行。 安装 npm install martinet 使用 Martinet 包括两个部分: Martinet 对象,处理调度调度任务; Worker 对象,接受任务定义。 Martinet 安装 var Martinet = require('martinet'); var martinet = new Martinet(); // Martinet allows you to create multiple workers // so that you can keep worker code in separate  // logical  modules.martinet.addWorker('WORKER_NAME_1', 'WORKER_PORT_1'); martinet.addWorker('WORKER_NAME_2', 'WORKER_PORT_2'); 创建任务 martinet.execute({     worker: 'WORKER_NAME',     name: 'task_name',     description: 'Do a thing' // Used in the backend so it's easier to lookup tasks later }, args); // args JSON object of named arguments, so like // { //    thing_id: 1    // } // // this object gets serialized and passed to the Worker // martinet.schedule('in 20 minutes', {     worker: 'WORKER_NAME',     name: 'task_name',     description: 'Do a thing in 20 minutes'}, args); martinet.every('30 minutes', {     worker: 'WORKER_NAME',     name: 'task_name',     description: 'Do a thing every half hour',     run_at: 'midnight' // optional time to start the recurring task}, args); Workers 安装 var MartinetWorker = require('martinet').Worker;var WORKER_PORT = 3000;var worker = new MartinetWorker(WORKER_PORT, {     martinet_url: '127.0.0.1',     martinet_port: '8089'}); 定义任务 worker.on('task_name', function(taskId, data, callback) {     // do a thing.     // if it's successful, callback(),     // if there's an error, callback(err)}); 端口 Martinet 的 pull socket 监听端口: var Martinet = require('martinet');var options = {     port: 8009};var martinet = new Martinet(options); DB 后端数据库的连接信息,使用 sequelize.js 选项。 默认: var Martinet = require('martinet');var options = {     db: {       database: 'martinet-db',       username: process.env.USER,       password: null,       options: {         dialect: 'sqlite',         storage: 'martinet.db',         logging: false,         omitNull: true       },       sync: true     }};var martinet = new Martinet(options); 使用 postgres: var Martinet = require('martinet');var options = {     db: {       database: 'martinet-db',       username: process.env.USER,       password: null,       options: {         dialect: 'postgres',         port: 5432,         host: 'database.host'         logging: false,         omitNull: true       },       sync: true     }};var martinet = new Martinet(options); 标签:Martinet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值