python在uv的基础使用
最近在进行MCP server 的开发,目前主流的 mcp server 主要以node 和python 为主,其中python 主要以uv 来启动服务的,我也是由此才开始接触uv,uv 工具可以管理本地的python 版本,虚拟环境以及打包发布,还可以运行脚本,作为mcp 开发的前序基础,本文主要记录以下使用uv 开发管理python 应用的各个环节。之后在进行mcp 开发时会一直使用uv 来管理环境。
最近在进行MCP server 的开发,目前主流的 mcp server 主要以node 和python 为主,其中python 主要以uv 来启动服务的,我也是由此才开始接触uv,uv 工具可以管理本地的python 版本,虚拟环境以及打包发布,还可以运行脚本,作为mcp 开发的前序基础,本文主要记录以下使用uv 开发管理python 应用的各个环节。之后在进行mcp 开发时会一直使用uv 来管理环境。
在python的整体生态中,虽然已经有很多库支持了异步调用,如可以使用httpx或者aiohttp代替requests库发起http请求,使用asyncio.sleep 代替time.sleep, 但是依然还有很多优秀的第三方库是不支持异步调用也没有可代替的库,那么如何在FastAPI中调用这种没有实现异步的库但是又不阻塞整个系统呢?
今年随着ChatGPT的爆火,也带火了一种前后端数据通信模式,使用SSE,可以让服务端一边生成内容,一边将数据返回给客户端,这样客户端可以不用等待服务端将内容全部生成。本文介绍如何在FastAPI中使用这种SSE方式返回数据,并且使用requests和aiohttp这两个第三方库调用这种SSE接口并且展示数据。
最近在学习大模型相关内容的时候,由于本地没有强大的显卡资源,很多模型是跑不起来的,但是看到阿里云机器学习平台PAI提供了一些免费的试用资源,于是准备薅一波羊毛,亲自玩一波大模型开发与微调。
接下来我将通过一系列的文章来记录一下,使用阿里云的免费资源来玩一些好玩的AIGC相关应用,主要包括ChatGLM2-6B、Llama2、通义千问、Stable Diffusion,模型微调相关的内容。
前两篇文章介绍了在golang中使用原生的rpc和使用json做为序列化工具进行rpc开发,但是它们都有着各自的缺点,原生的rpc不能跨语言,json在序列化和反序列化时效率又不高,所以本文我们再来学习一下grpc的使用,它完美的解决了它们的缺点
https://github.com/protocolbuffers/protobuf/releases
将下载的可执行文件放到对应系统的环境变量中,windows 中可以将protoc 目录添加到环境变量,mac 中可以将protoc 文件放到 /usr/local/bin 目录下,输入 protoc --version 来验证一下是否执行成功。
go install github.com/golang/protobuf/protoc-gen-go@latest
安装成功之后会在$GOPATH/bin/ 目录下生成一个protoc-gen-go 文件
proto 文件与go 中的结构体一一对应,如果我们在go 中定义一个User的结构体
type User struct{
Name string
Age int
Frends []string
}
上文介绍了如何在golang 中使用原生的net/rpc 进行开发,但是使用原生的rpc有一个问题,不能跨语言,只能服务端和客户端都是golang时才可以,本文介绍如何使用json作为序列化在不同的语言间进行rpc调用。
首先我们先来修改一个服务端的代码,之前的代码中,服务端收到客户端发来的数据以后,是通过 rpc.ServeConn(conn)来处理请求的
for {
fmt.Println("等待连接。。。。")
// 3. 建立连接
conn, err := lister.Accept()
if err != nil {
fmt.Println(err)
}
// 4. 绑定服务
rpc.ServeConn(conn)
}
如果要使用json来处理的话,只需要将原来的rpc.ServeConn(conn)修改为 rpc.ServeCodec(jsonrpc.NewServerCodec(conn))即可。
很早之前也了解过一些rpc, 但是心理始终接受不了这种东西,觉得http 用的好好的,为什么要那么麻烦的使用rpc? 且还要定义什么proto 文件 ,后来看了一篇文章 ,既然业内都在使用并且都快成为一种行业标准了,必然有它的优势。 以下是文章原文
go 标准库的 net\rpc 对rpc原生的支持,我们先来看一下使用go标准库是如何开发rpc应用的。
服务端开发主要分为以下四步
在golang中,goroutine 可以理解为其它语言中的线程,在其它语言中存在的数据竞态的问题,在golang中同样存在
本文记录一下数据竞态与各种锁的使用
这个词也没有听起来很高大上,其实并没有什么新鲜的东西,就是多个协程对同一个变量进行读写,造成了状态不一致,得不到正确的结果,我们来看一下代码
package main
import (
"fmt"
"sync"
)
var data int
func incr(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 10000; i++ {
data = data + 1
}
}
func main() {
wg := sync.WaitGroup{}
wg.Add(2)
go incr(&wg)
go incr(&wg)
wg.Wait()
fmt.Println(data)
}
相信很多人对于golang中的context 都有一定的了解,都知道它是一个上下文管理,有一个根context, 再通过这个根context 创建出有更多功能的context, 如具有cancel 功能的,有timeout功能的。 我们搜索的时候,我们可能看到最多的就是以下的代码
作为一名合格的开发人员,写单元测试可以很好的梳理代码逻辑,让问题尽早的暴露出来,甚至有些公司或者团队会硬性要求开发人员写单元测试用例,并且还要有多少多少的覆盖度, 本文先以简单的函数单元测试为例,一点点的引入http的接口测试,最后再讨论一下gin 框架的单元测试,包括GET与POST方法 以下是本文的内容结构。
