/image/avatar.png

FastAPI中如果调用同步函数

在python的整体生态中,虽然已经有很多库支持了异步调用,如可以使用httpx或者aiohttp代替requests库发起http请求,使用asyncio.sleep 代替time.sleep, 但是依然还有很多优秀的第三方库是不支持异步调用也没有可代替的库,那么如何在FastAPI中调用这种没有实现异步的库但是又不阻塞整个系统呢?

使用LangChain自定义模型的流式输出

最近使用阿里云模型服务灵积,上面有很多开源的大模型提供接口调用,阿里自家通义千问也在,申请体验了一下,结果并不那么尽如人意,参看之前的文章,本文先不讨论大模型质量问题,本文讨论一下如果通过LangChain来调用灵积接口,并且通过gradio构建一个web服务demo。

使用FastAPI与aiohttp进行SSE响应开发

今年随着ChatGPT的爆火,也带火了一种前后端数据通信模式,使用SSE,可以让服务端一边生成内容,一边将数据返回给客户端,这样客户端可以不用等待服务端将内容全部生成。本文介绍如何在FastAPI中使用这种SSE方式返回数据,并且使用requests和aiohttp这两个第三方库调用这种SSE接口并且展示数据。

使用阿里云机器学习平台部署ChatGLM2-6B

最近在学习大模型相关内容的时候,由于本地没有强大的显卡资源,很多模型是跑不起来的,但是看到阿里云机器学习平台PAI提供了一些免费的试用资源,于是准备薅一波羊毛,亲自玩一波大模型开发与微调。

接下来我将通过一系列的文章来记录一下,使用阿里云的免费资源来玩一些好玩的AIGC相关应用,主要包括ChatGLM2-6B、Llama2、通义千问、Stable Diffusion,模型微调相关的内容。

使用golang进行rpc开发之三使用grpc进行开发

前两篇文章介绍了在golang中使用原生的rpc和使用json做为序列化工具进行rpc开发,但是它们都有着各自的缺点,原生的rpc不能跨语言,json在序列化和反序列化时效率又不高,所以本文我们再来学习一下grpc的使用,它完美的解决了它们的缺点

  1. 安装protoc

https://github.com/protocolbuffers/protobuf/releases 将下载的可执行文件放到对应系统的环境变量中,windows 中可以将protoc 目录添加到环境变量,mac 中可以将protoc 文件放到 /usr/local/bin 目录下,输入 protoc --version 来验证一下是否执行成功。

  1. 安装对应语言的插件, golang 中为
1
go install github.com/golang/protobuf/protoc-gen-go@latest

安装成功之后会在$GOPATH/bin/ 目录下生成一个protoc-gen-go 文件

  1. 编写 proto 文件

proto 文件与go 中的结构体一一对应,如果我们在go 中定义一个User的结构体

1
2
3
4
5
type User struct{
	Name string
	Age int
	Frends []string
}

使用golang进行rpc开发之二使用json进行开发

上文介绍了如何在golang 中使用原生的net/rpc 进行开发,但是使用原生的rpc有一个问题,不能跨语言,只能服务端和客户端都是golang时才可以,本文介绍如何使用json作为序列化在不同的语言间进行rpc调用。

首先我们先来修改一个服务端的代码,之前的代码中,服务端收到客户端发来的数据以后,是通过 rpc.ServeConn(conn)来处理请求的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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))即可。

使用golang进行rpc开发之一使用原生rpc开发

很早之前也了解过一些rpc, 但是心理始终接受不了这种东西,觉得http 用的好好的,为什么要那么麻烦的使用rpc? 且还要定义什么proto 文件 ,后来看了一篇文章 ,既然业内都在使用并且都快成为一种行业标准了,必然有它的优势。 以下是文章原文

既然有HTTP协议,为什么还要有RPC

一、go中原生的rpc开发

go 标准库的 net\rpc 对rpc原生的支持,我们先来看一下使用go标准库是如何开发rpc应用的。 服务端开发主要分为以下四步

  1. 注册rpc服务
  2. 设置端口监听
  3. 等待连接
  4. 服务调用

golang中的锁

在golang中,goroutine 可以理解为其它语言中的线程,在其它语言中存在的数据竞态的问题,在golang中同样存在

本文记录一下数据竞态与各种锁的使用

race condition 竞争状态

这个词也没有听起来很高大上,其实并没有什么新鲜的东西,就是多个协程对同一个变量进行读写,造成了状态不一致,得不到正确的结果,我们来看一下代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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)

}

通过http库控制请求超时来一窥context的使用

相信很多人对于golang中的context 都有一定的了解,都知道它是一个上下文管理,有一个根context, 再通过这个根context 创建出有更多功能的context, 如具有cancel 功能的,有timeout功能的。 我们搜索的时候,我们可能看到最多的就是以下的代码