misc
格式化json输出
# 也可以制定别名
# alias prettyjson='python -m json.tool'
python -m json.tool a.jsonmarkdown 转 pdf
由于 Typora 现在收费,需要找一些提到方法:
替代软件
MarkText:可行
VSCode 插件
Markdown PDF:没有试验成功
python 包
一般做法是先将 markdown 转换为 html,而后再转为 pdf。下面的方法有些缺点待解决:
markdown将 markdown 字符串转换为 HTML 字符串时会出现例如 Markdown 语法中的代码块无法被转换正确的情况pdfkit包用于将 HTML 字符串转化为 PDF,但对中文的支持还没找到较好的解决方案,并且这个包依赖于 wkhtmltopdf 这个软件
pip install markdown # markdown -> html
pip install pdfkit
sudo apt-get install wkhtmltopdf备注:目前还没搜索到符合以下条件的 Python 包:
直接用
pip install进行安装,并且不需要额外用apt安装其他软件安装完后提供命令行工具一键转换
默认对中文字符进行支持
提供对 Markdown 常见扩展语法的正常转换,并且不会丢失图片
内存及显存
参考自 accelerate.utils.modeling.get_max_memory
http 免密
代理设置
参考博客
前置条件: 使用 Windows 电脑并且使用 Clash 配置代理, 并打开 Allow LAN 选项, 下面介绍怎么在 Windows 上和 WSL2 上使用代理
情形一: 在 Windows 本机上, 在 python 中可以通过这种方式设置代理
情形二: 在 WSL2 中
情形三: 在 Windows 本机上使用 git clone 命令:
一次性使用
永久配置
重置代理
情形四: 在 huggingface datasets 库中使用 proxies 参数
备注: 上述写法实际上会报错, 原因在于 load_dataset 方法会触发如下调用栈
消息队列: RocketMQ
基本概念
RocketMQ 是阿里开发的消息队列组件, 涉及的一些概念参考官方文档
Producer: 生产者负责向队列里写消息
ProducerGroup: 每个生产者必须指定唯一的一个 ProducerGroup, 但每个队列都可以往队列发送不同的 Topic 的消息
Consumer: 消费者负责从队列中读取消息, 注意一个消息被读取, 并不一定立即出队列
ConsumerGroup: 每个消费者必须指定唯一的一个 ConsumerGroup
Subscription: 消费者可以根据 Topic, Tag, Key 这些条件来过滤, 以获取感兴趣的消息. 注意一个消费者必须指定唯一的一个 Topic 进行订阅, 但同属一个 ConsumerGroup 的消费者可以指定不同的 Topic 进行订阅
ConsumerOffset: RocketMQ 会在内部为每个 ConsumerGroup 维护一个 Offset, 以避免消息被重复消费
Topic:
MessageQueue: 在一个 Topic 下的消息, RocketMQ 可能会使用多个队列来存储消息, 以实现负载均衡
Message: 消息需要设置 Topic, 同一个 Topic 的消息会被负载均衡得放入至多个 MessageQueue 中, 每条 Message 可以设置 Tag 和 Key, 便于消费者根据这些元数据过滤信息
MessageTag:
MessageKey:
MessageType: RocketMQ 支持 NORMAL, FIFO, TRANSACTION, DELAY 这几种消息类型 (TODO:这几个类型的具体含义)
MessageView: 消息的可读视图, 但不能修改消息
MessageOffset: 每个消息在进入消息队列时, RocketMQ 会记录这条消息所在 MessageQueue 的 Offset, Offset 的数据类型是 long int
MessageID: 作为消息的全局唯一标识符, ID 由 RocketMQ 内部自动设定, 确保消息在 RocketMQ 中能够被唯一识别.
MessageBody: 消息的实际内容, 可以是任意形式的字节数据
TransactionChecker: 事务相关 (TODO: 具体含义)
Topic, Tag, Key 的通常用法: Topic 一般对应一个项目, Tag 对应于各个子项目, 而 Key 一般用于具体的业务逻辑约定. 例如: Topic="SALE" 表示销售场景的项目, 而 Tag="ONLINE" 和 Tag="OFFLINE" 分别代表线上和线下的场景, 而进一步用 Key=buy_id 用于表示一次具体的购买行为的唯一标识.
基础使用
启动服务, 完全参考 https://rocketmq.apache.org/docs/quickStart/02quickstartWithDocker/ 即可, 如下:
使用消息队列(Python使用方式), 主要参考自 https://github.com/apache/rocketmq-client-python/tree/master, 备注: 官方的 README 疑似有些地方没有及时和代码同步
输出:
进阶使用
样例1: 鉴权
与 手机APP 类比: 其中 access_key 相当于用户名, access_secret 相当于密码, channel 相当于设备平台类型, 例如: iOS/Android
样例2(待完善)
producer.py:
consumer.py:
疑问:
keys里面各项的含义PushConsumer里orderly和message_model的含义subscribe方法expression参数应该怎么填producer/consumer 的 group-id 的含义
例子3
(1) 使用 fastapi 实现服务端
接口入参:
接口出参:
接口在返回后, 会作为消费者向 rocketMQ 里写消息多个消息, 且 topic 固定为 "TID-1", key 为接口出参里的 requestId, 消息内容是这样的(首先流式返回文本, 用 message表示, 结束用end标识)
(2) 使用 requests 实现 python 客户端
(3) h5 实现客户端
杂录
PushConsumer 与 PullConsumer 的区别
Last updated
Was this helpful?