# WASM 初体验
最近看到了很多介绍 webassembly 的文章,包括字节的公众号连续分享了两篇文章:
- # WebAssembly 使用场景和未来发展趋势
- WebAssembly 常用开发语言和工具链
简单来说,webassembly 可以将你用 c、go、rust 等语言写的程序打包,交给 js 在浏览器中调用。我觉得是非常有用的一项技术,一切能用浏览器实现的技术应该早晚会交给浏览器。
出于学习的想法以及对 go 和前端的开发经验,找了一份小教程,体验了一下 go-wasm:
教程:# Go WebAssembly (Wasm) 简明教程
还是挺有趣的,把 go 的编译目标系统和架构分别改成 js 和 wasm,然后前端还需要引入 wasm_exec.js。
这里有个小坑,就是用最新的 golang 官方库里面最新的 wasm_exec.js(https://github.com/golang/go/tree/master/misc/wasm)可能会出现报错,要用 google 的这个版本(https://go.googlesource.com/go.git/+/refs/tags/go1.17rc1/misc/wasm/wasm_exec.js?autodive=0%2F%2F)
# wsgi 和 asgi
工作中常用到 python,使用 python 开发 web,一般会用到 flask、django,现在一般采用前后端分离方法,所以一般也不用模板了。python 项目只提供网络接口。开发的时候运行很方便,但是部署的时候一般使用 gunicorn 部署。 它是一个符合 wsgi 规范的 http 服务器,用于为 python web 应用提供底层网络实现。python 还有另外一种网关接口叫做 ASGI,就去查资料了解了一下区别。
首先了解一下基本概念:
- web 服务器:用于提供网络服务,接受外部请求、响应、转发等,比如 nginx、tomcat、apache 等
- web 应用程序:用于处理请求,执行服务,返回结果,比如 django、flask 等等
- 网关接口,用于连接 web 服务器和 web 应用程序,wsgi 和 asgi 就是干这个的
wsgi 是基于 python 的一个网关接口,它不支持 http2.0,websocket 等长连接,只能支持一个请求、一个回应的方式;
asgi 是异步的网关接口,得益于 python3.5 之后加入了 async/await 特性,对 http2.0 和 websocket 提供了支持。
参考:https://blog.csdn.net/studyeboy/article/details/120956188
# gunicorn
再了解一下 gunicorn!
wsgi 服务器会预先生成一批 worker 等待请求的到来,存在一个 master 来管理这些 worker。
worker 也有不同的类型:
- sync workers
每个 worker 一次只处理一个请求,并发量很低 - async workers
基于 Greenlet 有两种:Gevent、Eventlet。- GreenLet 是 python 的协程实现、一个线程内,可以有多个 GreenLet,同一时间,只有一个 Greenlet 在 run,调度由系统实现。
- Gevent:通过 Greenlet 协程和 libev 快速事件循环实现异步。 每个请求的连接都是一个 Greenlet 协程,IO 等待时,不会阻塞其他请求的处理
- Eventlet 在 Greenlet 的基础上实现了自己的 GreenThread,实际上就是 greenlet 类的扩展封装,而与 Greenlet 的不同是,Eventlet 实现了自己调度器称为 Hub,Hub 类似于 Tornado 的 IOLoop,是单实例的。在 Hub 中有一个 event loop,根据不同的事件来切换到对应的 GreenThread。同时 Eventlet 还实现了一系列的补丁来使 Python 标准库中的 socket 等等 module 来支持 GreenThread 的切换。
- tornado workers
配合 tornado 网络框架使用,基于异步非阻塞模型处理长延时请求。
gunicorn 的高并发就是通过这些 worker 来实现的,worker 配置一般是 2 * CPU+1,在任何时间,都有一半在 io、另一半在占用 cpu。
启动参数:
1)-c CONFIG,–config=CONFIG | |
指定一个配置文件(py文件) | |
2)-b BIND,–bind=BIND | |
与指定socket进行板顶 | |
3)-D,–daemon | |
后台进程方式运行gunicorn进程 | |
4)-w WORKERS,–workers=WORKERS | |
工作进程的数量 | |
5)-k WORKERCLASS,–worker-class=WORKERCLASS | |
工作进程类型,包括sync(默认),eventlet,gevent,tornado,gthread,gaiohttp | |
6)–backlog INT | |
最大挂起的连接数 | |
7)–log-level LEVEL | |
日志输出等级 | |
8)–access-logfile FILE | |
访问日志输出文件 | |
9)–error-logfile FILE | |
错误日志输出文件 |
# daisyUI
https://daisyui.com/docs/install/
一个基于 tailwindcss 的组件库,之前常用 element,好用的同时又嫌弃他样式太丑了,也不好改,于是在新的小项目中使用了 daisyUI 尝试一下,并且自己写 css 的时候也可以参考它的源码库,挺有意思的。
# AndBrowser
https://github.com/restsend/andbrowser
在浏览器中接入了 scrcpy,使用了 web 提供的 api,筛选并连接安卓 usb 设备,推送 scrcpy 程序到设备中,并启动,随后连接屏幕视频流和控制流,同时也提供文件管理,作者提供了在线的 demo:https://browserlify.com/?from=github
作者是一个做自动化的大佬,他在知乎上也介绍了这个项目的原理:# Phone On Web 的实现原理
# 本周阅读
# 诡秘之主
看到了第二卷:无面人。
少有的文笔很好的小说,细节描写非常丰富,很容易将我的想象力带入进书中的世界。还会继续看下去。
目前缺点在于,我不太清楚主线的最终目的,可能我看漏了,或者书中没有过多的强调,主线一直不太清晰,我不明白克莱恩最终要怎么样。
# linux 命令行与 shell 脚本编程
相比起鸟哥的 liunx 私房菜,这本书读起来就简单多了,基本上就是诸多命令的说明书,也有丰富的案例。适合我这种 linux 菜鸡读,不过之后还会重新读鸟哥。学的深一点更好。
# 买的新玩意儿
# ps5
今年过生日老婆打算送我 ps5, 本着早买早享受的原则,已经从拼多多买来了,买个三个游戏:双人成行、p5r、蜘蛛侠迈尔斯。 据说各版的 ps5 都可以刷成外服,不过我还是买了日版的,虽然没有保修,不过这东西一般不会坏吧。
电视上打游戏真的爽!
# always blue
之前看美剧《硅谷》,对他们玩的那个 always blue 非常感兴趣,就去淘宝搜了一下,叫做手抛球、变色球。还是挺有意思的,可惜发给我的不是蓝色的。
# 重构项目的反思
最近工作中在重构两个项目。
在之前的使用中有很多想法,将它优化,但到实际执行中,发现难以下手,着实有点眼高手低,对整体的设计还是不够了解,对自己的优化想法也没有实际的细节上的规划。要吸取教训,以后要注意:
- 了解整体项目架构:每个点设计的原因细节要搞清楚,前后端实现都要了解
- 分析优化点为什么要优化,根源问题在哪?
- 修改点要想清楚,前后端增加的工作量不能无效增加