惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Cisco Blogs
Schneier on Security
Schneier on Security
T
Tor Project blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Threat Research - Cisco Blogs
C
CERT Recently Published Vulnerability Notes
Security Latest
Security Latest
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
NISL@THU
NISL@THU
L
Lohrmann on Cybersecurity
Scott Helme
Scott Helme
Webroot Blog
Webroot Blog
Project Zero
Project Zero
Google Online Security Blog
Google Online Security Blog
The Last Watchdog
The Last Watchdog
Spread Privacy
Spread Privacy
Hacker News: Ask HN
Hacker News: Ask HN
PCI Perspectives
PCI Perspectives
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
D
Darknet – Hacking Tools, Hacker News & Cyber Security
N
News | PayPal Newsroom
Help Net Security
Help Net Security
The Hacker News
The Hacker News
H
Heimdal Security Blog
O
OpenAI News
S
Security @ Cisco Blogs
N
News and Events Feed by Topic
Cyberwarzone
Cyberwarzone
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
www.infosecurity-magazine.com
www.infosecurity-magazine.com
博客园 - 叶小钗
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Hacker News - Newest:
Hacker News - Newest: "LLM"
T
Tailwind CSS Blog
大猫的无限游戏
大猫的无限游戏
A
Arctic Wolf
I
Intezer
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security Affairs
P
Proofpoint News Feed
S
Secure Thoughts
腾讯CDC
Google DeepMind News
Google DeepMind News
量子位
罗磊的独立博客

一个工匠

AI 发展临界点 - 快上车 流式响应(Chat):HTTP 响应体字节流的读取与解析 iPhone 截屏高效翻译 Flash Open Terminal iPhone 侧载安装 Xcode Symbolic Debug AI 指北 投资风险收益评估 Mac 快速修改系统快捷键 Git Record passkey How to pay apple frameworks Mac - Command Line Tools DNS 的 CNAME 是如何工作的 WebRTC 的一些解释 SSE 指南 1.1.1.1、WARP 和 MASQUE 移动端换端方案与场景还原 设备发现 分辨率 - 像素密度 - HiDPI Mac 字体 ESP32 trump - 川普 币圈 - 虚拟货币 【旅游】富士山 【旅游】sakura(樱花) 【旅游】千岛湖 我的 2023 【Swift】中文词语纠错 计算机字符编码与内存编码 - Unicode、UTF8、String 从汇编角度理解 “函数调用栈” 和 “有栈协程” 在 Xcode 中更好的使用 Swift 通过 Swift Package 制作二进制库 Arc 浏览器 - 意外的惊喜 【Swift 三方源码 1】SwiftShell 高效的命令行工具 Swift 脚本开发环境搭建 rime - 小鹤双拼 【旅游】沿海旅游 (威海、青岛) 好记性远远不如烂笔头 高级语言小记 又一年高考 Vision 未来已来 致敬耗子哥 Socket 与 ICMP 对互联网隐私的一些想法 网络代理是如何工作的 (致敬 Surge) 又十年 - 至三十而立 双拼 - 少有的高回报效率技能 Vim 技巧 我的 2022 三年疫情五味杂陈 - 下 老梗 - 浏览器按回车后发生了什么 三年疫情五味杂陈 生活推荐清单 Shell 和进程 有计划的努力 内卷 不确定性 数学可以保障逻辑自洽 这些年我的软件清单 决定做一些改变 函数调用栈之彻底理解 锁 - 共享数据安全指↑ 江苏女有感 碎碎念 - 2022 碎碎念 - 2021 打算记录一些碎碎念 多重性格就是逆天改命 从 Core Foundation 看更大世界 TCP 数据传输过程分析 iOS main 文件中的 @autoreleasepool 的真实用途 多线程的难点在哪里 Objective-C 和 Runtime 早起打卡计划 ing 打比方 IM 和 Socket 的关系及 Heart 的必要性 如果我的人生突然只剩下 8 小时... 胡说八道之雪粉 Array 和 LinkedList 的深刻认知 Swift struct (值类型) 与 class (引用类型) 区别及三种传参机制深刻关系和使用 逃离信用卡和花呗 Swift_let_var_struct_class 网聚人的力量 - 网易 绿皮火车 喝酒十之八九会误事 HKong 胡说八道之云服务 互联网网络传输协议理解坑点 CPU 的制作 我心里一直有一个念想 网络基础协议 为什么 32 位操作系统只能用 4G 内存空间 努力和天赋 洗牙 RAC-Api-Summer iOS 内存原理 Block 闭包简查记录 《白夜行》 老博新开 祭首
谈谈事件驱动
海驴 · 2018-11-08 · via 一个工匠

事件驱动这个技术方案,可以说实实在在影响了这些年编程界的技术方向。最实际的受用者应该就是异步编程了,如 I / O。

我所认知到的语言,都是事件驱动的使用者,受益者,推动者。

很多朋友可能更多的停留在精通官方 API 阶段,还没有更深层次的认知计算机原理,不晓得代码是怎么工作的。我不精通官方 API,计算机原理也认知浅薄,但在自己认知的语言范围内了解了一些。我感到庆幸,希望和大家分享。

事件驱动的形象描述

A 和家人去外婆家取了个号。A 一直在门口等着,是阻塞。A 出去玩一会,门分钟去外婆家门口看看到了自己号没有,是监听。A 去一个衣服店看衣服去了,到了自己号的时候,收到外婆家发的短信消息后直接去外婆家,是回调。

上面这个例子,变种极多也千篇一律。串行并行、同步异步、阻塞非阻塞都可以用。我们用这个例子来说事件驱动

这里分析第三种情况,A 去看衣服去了,这个时候外婆家的号叫到自己,并短信通知了自己,这个行为的分析。

A 查看短信的行为和外婆家发出短信的行为,就是我们分析的重点。

外婆家为了发出这个短信,需要耗时,甚至外婆家也不知道耗时多久。所以外婆家需要做的是,一定要在 A 的号到了的时候,准确及时的发出短信,这是一个事件的发出。

A 虽然有手机,但是看不看短信是 A 的事情。所以 A 一定要在看到短信之后立即作出处理判断,这是一个事件的反馈。

但是 A 为了能够尽快吃到饭,多做了几手准备,他把西贝、海底捞几家店的号都拿了,打算谁先叫到自己,就去谁家。

所以 A 接受到的事件是多个并且不确定的。

Life is thread,我们把 A 比作一个线程。A 能够及时响应各家店面发来的消息,原因就是线程里面有一个while (true):{pass;}这样的循环。依靠 CPU 这个超强大脑控制器,只要有事件需要通知到线程,线程里面的这个 while 循环就会获取到并及时处理。

所以事件驱动的本质是:一方及时发出事件,通过 CPU 时间片实时轮转事件循环队列并告知到 while 循环以通知到另一方,另一方及时响应事件。

iOS 中的使用

Runloop

Runloop可以说把事件驱动利用到了极致。你能想象,如果没有Runloop,你就真的不能使用 iPhone 手机了!
Runloop依托于线程。我们手势点击一个按钮,就是在操作主线程里的Runloop
Runloop通过事件驱动在以下 8 种状态下实时循环切换,用于省电的同时又能够及时处理用户界面反馈。

1
2
3
4
5
6
7
8
typedef CF_OPTIONS(CFOptionFlags, CFRunLoopActivity) {
kCFRunLoopEntry = (1UL << 0), // 即将进入Loop
kCFRunLoopBeforeTimers = (1UL << 1), // 即将处理 Timer
kCFRunLoopBeforeSources = (1UL << 2), // 即将处理 Source
kCFRunLoopBeforeWaiting = (1UL << 5), // 即将进入休眠
kCFRunLoopAfterWaiting = (1UL << 6), // 刚从休眠中唤醒
kCFRunLoopExit = (1UL << 7), // 即将退出Loop
};
闭包

我们通过 IOS 里的Block闭包,可以在异步执行一串功能逻辑代码后接着处理闭包里的活。

1
- (void)someMethodThatTakesABlock:(returnType (^nullability)(parameterTypes))blockName;
1
[someObject someMethodThatTakesABlock:^returnType (parameters) {...}];
还有其他非常多的使用,如通知等

Python 中的使用

Python 近些年才完全开发完优秀的协程并开放使用。使得 Python 上多并发成为事实上的可能。这里的多,不是之前的几十几百,是上十万。

Event_loop+协程

Python 里面使用多线程其实并不怎么爽,本身就是耗资源的语言,多线程切换更加雪上加霜了。通过协程,妥妥的解决了上十万的并发。

1
2
3
4
5
6
7
8
9
import asyncio
async def test(i):
print("test_1",i)
await asyncio.sleep(1)
print("test_2",i)
loop=asyncio.get_event_loop()
tasks=[test(i) for i in range(5)]
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
aiohttp

网络访问上的多并发,对协程的进一步封装。

Node.js 中的使用

Event_loop事件循环

这个就没得说了,彻彻底底依靠事件驱动起家的语言。基于javascriptV8引擎起来的 Node.js,就是完完全全的单线程语言。
可是要知道,Node.js 就是以单线程中使用事件驱动处理高 IO 闻名世界的。
你可以想象一下,一个 Node.js 搭建的后台,每秒上千上万的并发,都是单线程在处理吗?
Java 就是一个用户一个请求一个线程(又名线程驱动),服务器资源耗费真的大。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var fs = require("fs");
var debug = require('debug')('example1');

debug("begin");

fs.readFile('package.json','utf-8',function(err,data){
if(err)
debug(err);
else
debug("get file content");
});

setTimeout(function(){
debug("timeout2");
});

debug('end');