Python 文档阅读 - 内建 bin 函数

查看原文

Python bin 内建函数返回一个数字的二进制字符串。

另外,可以用 format(n, '#b') 获得带 0b prefix 的字符串,用 format(n, 'b') 获得不带prefix的字符串,用 f{n:#b}f{n:b} 这种 fstring 也能等价。

read more

源码阅读 - asgiref.wsgi 模块

查看原文

WsgiToAsgi 是将 WSGI 适配到 ASGI 运行的实现。它的基本原理是是 为 WSGI 的 __call__ 创建了 WsgiToAsgiInstance instance。这个 instance 只处理 type=http.request 事件,并将 asgi app 用 AsyncToSync 套上后等待其处理完成。处理的逻辑是调用 wsgi app, 将结果适配成 asgi 的标准后 send type=http.response.body 事件。

read more

源码阅读 - asgiref.server 模块

查看原文

asgiref.StatelessServer 类实现了 server 的基类,处理 instance creation/ pooling, exception handling. 子类继承后覆盖 handle() 方法,调用 get_or_create_application_instance(unique-id, scope) 获取或新建 app instance, 你可以向这个 app instance put message.

如果设定了 max_application, 且到达了上限,最老的那个会被干掉。

有个 coroutine 默认每 100ms 找 error, 并打印到 console. 可以重写 application_exception()做其它的事情。

read more

源码阅读 - asgiref.sync 模块

查看原文

asgiref.sync 实现了 AsyncToSync / SyncToAsync 两种类,分别用于将同步和异步的方法和函数转换类型使用。

  • AsyncToSync 的实现是 在 __call__ 中调用 loop.call_soon_threadsafe(f),, 限制是只能在主线程中。
  • SyncToAsync 的实现是在 async def __call__ 中调用 fut = loop.run_in_executor(...); return await asyncio.wait_for(fut).
read more

协议阅读 - ASGI

查看原文

ASGI 全称是 Asynchronous Server Gateway Interface,它旨在为 Python 网络服务器程序提供一套标准接口。它规定了一套服务器交互和运行 app 程序的 API。

它的前身是 WSGI,WSGI 只关注 HTTP 的请求响应模型,另外 WebSocket 也不包括在里面。ASGI 有着更大的野心。

ASGI 有两个组件:Protocol Server & Application。前者处理 sockets,转为 pre-event messages;后者存活在 protocol server, per socket 中,处理 event messages。app 不像 WSGI 那样是个 callable,而是一个 …

read more

数据库 2PL v/s MVCC

查看原文

解决幻读 (Phantom Read) 的方法有两种:2PL 与 MVCC。

幻读 = 范围查询出现了别的事务的数据。

2PL (Two-Phase Locking) 是传统做法,通过 shared(read) 和 exclusive(write) lock 序列化事务调度。例如 MySQL(InnoDB),在底层它为每行或一段行获取 shared physical lock 。它使用的技术叫 next-key locking. 假设事务在 MySQL 中使用 Serializable isolation level,事务B 中的插入会因为事务A获得了锁,导致事务B等待(超时后回滚)

MVCC 的假设是 Readers 和 Writers 互相不应该堵塞,所以它的方法是乐观的:冲突就让它发生 …

read more

协议阅读 - ASGI 如何处理 HTTP 和 WebSocket 数据

查看原文

这篇 spec 规定了 ASGI 如何处理 HTTP 和 Websocket 数据。

  • HTTP:
    • http connection scope 包含的信息:type=http, http_version=1.0/1.1/2, method, scheme, path, query_string, root_path, headers, client=[host, port], server=[host, port]
    • http request: type=http.request, body, more_body=true/false.
    • restart start: type=http.response.start …
read more

Up - 一款使用 Lambda 和 Gateway 的部署工具

查看原文

Up 是 TJ 写的关于 Lambda 和 AWS Gateway 的部署工具。它安装简单,配置也只需要读取 ~/.aws/credetials,和相关的 IAM 配置。简单地输入 up 即可部署到 dev stage,输入 up url --open 打开 url,输入 up url --copy 获得 url。它支持多种语言,各种语言的依赖也都遵从标准。不管是 API 设计和文档编写,都是典范。

read more

Runit 应用于桌面环境

查看原文

这位仁兄将 runit 应用于桌面环境,除了 X11 有点不太好使,整体速度较之 systemd 快了有两三倍,配置也更简单。他认为自 X11 和 BSD Socket 之后,Unix 的哲学就一直有点崩塌,如果可以让 Plan9 这样的项目元素再多一些会更好。

read more

« Page 47 / 54 »