PythonGolang IPC桥,Goridge的python客户端

pygoridge的Python项目详细描述


Pygoridge:Python到golangipc桥,用于Goridge的Python客户端

GoDoc

Pygoridge是一个Python-to-Golang编解码器库,可以在sockets和golangnet/rpc包上工作。 这是一个优秀的Goridge库的php客户端的python端口。 该库允许您从Python调用Go服务方法,只需占用最少的空间、结构和[]byte支持。在

Pygoridge还包括Worker类,在工作进程中使用https://github.com/spiral/roadrunner-高性能应用服务器、负载平衡器和Golang编写的进程管理器。在

特点

  • 无外部依赖项
  • 可与RoadRunner一起使用,以创建CPU密集型服务器,并使用简单的顺序python工作线程(无需多处理模块)。这对克服GIL非常有帮助。在

安装

$ go get "github.com/spiral/goridge"
^{pr2}$

示例:python客户机调用go服务器方法

frompygoridgeimportcreate_relay,RPC,SocketRelayrpc=RPC(SocketRelay("127.0.0.1",6001))# or, using factorytcp_relay=create_relay("tcp://127.0.0.1:6001")unix_relay=create_relay("unix:///tmp/rpc.sock")stream_relay=create_relay("pipes")print(rpc("App.Hi","Antony"))rpc.close()# close underlying socket connection# or using as a context managerwithRPC(tcp_relay)asrpc:print(rpc("App.Hi","Antony, again"))
packagemainimport("fmt""github.com/spiral/goridge""net""net/rpc")typeAppstruct{}func(s*App)Hi(namestring,r*string)error{*r=fmt.Sprintf("Hello, %s!",name)returnnil}funcmain(){ln,err:=net.Listen("tcp",":6001")iferr!=nil{panic(err)}rpc.Register(new(App))for{conn,err:=ln.Accept()iferr!=nil{continue}gorpc.ServeCodec(goridge.NewCodec(conn))}}

示例:使用python workers运行http服务器(RoadRunner)

您可以从releases page下载最新的RoadRunner二进制文件。在

另请参见^{}。在

cd examples/roadrunner/http_server/
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt

工人阶级

fromfunctoolsimportpartialimportujsonfrompygoridgeimportcreate_relay,Workerjson_dumps=partial(ujson.dumps,ensure_ascii=False,escape_forward_slashes=False)json_loads=ujson.loadsclassHTTPWorker(Worker):defhello(self,headers):returnheaders,{"X-Server":"RoadRunner with python workers"}if__name__=="__main__":rl=create_relay("pipes")worker=HTTPWorker(rl,json_encoder=json_dumps,json_decoder=json_loads)whileTrue:context,body=worker.receive()ifcontextisNone:continuehttp_headers=json_loads(context.tobytes())response,response_headers=worker.hello(http_headers)worker.send(json_dumps(response).encode("utf-8"),response_headers)

运行RoadRunner服务器

cd examples/roadrunner/http_server/
./rr serve -d -v

发出http请求以将请求头作为响应体返回

curl 'http://localhost:8080/' --compressed

RoadRunner是高度可定制和可扩展的,因此您甚至可以使用所需的API协议为其编写自己的插件(请参见示例php-grpc server)。在

定制编码器/解码器,加快json处理速度

frompygoridge.jsonimportjson_dumps,json_loads# you can also provide custom json encoder for faster marshallingrpc=RPC(tcp_relay,json_encoder=json_dumps,json_decoder=json_loads)

许可证

麻省理工学院执照。有关详细信息,请参见^{}。在

发展

运行eh3测试>
docker-compose -f ./goridge/tests/docker-compose.yml up -d
docker-compose -f tests/rr_test_app/docker-compose.yml up -d
python3 -m unittest discover -s tests

运行linter

pip install flake8
flake8 pygoridge

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
我可以用C++代码使用java代码吗?   java使用JSR303在派生类中提供更具体的约束   java在这个查找唯一路径数算法中我做错了什么?   java如何为2个不同的服务提供商使用2个不同的SSL证书?   java在Gridview上绘制文本   java使用连接for循环构建字符串名   java StringBuilder拆分无法处理某些文件   java事件关注EditText   Java Web Start“找不到URL的缓存资源”   java程序从命令行运行的速度比在Eclipse中慢   java为什么HttpServletRequest会截断#字符上的url输入?   java自定义折叠工具栏平滑标题大小调整   使用Mockito对安卓 java中调用另一个静态函数的函数进行单元测试   http在java客户机中使用cachecontrol头   java如何使用。是否使用Delimiter从输入文件中排除标点符号和数字?   使用上下文作为参数/参数的java   java更有效地从Jar中提取文件   java为多个JButton提供相同的actionListener