python实现rpc的几种方式(SimpleXMLRPCServer 自带的、第三方ZeroRPC)、连接linux远程开发分布式锁、分布式id

1 python实现rpc的几种方式
1.1 SimpleXMLRPCServer 自带的
1.2 第三方ZeroRPC

2 连接linux远程开发
3 分布式锁
4 分布式id

1 python实现rpc的几种方式

# 远程过程调用-1 借助于rabbitmq,可以跨语言-2 SimpleXMLRPCServer 自带的-3 ZeroRPC-4 GRPC:跨语言的  https://zhuanlan.zhihu.com/p/425725192

1.1 SimpleXMLRPCServer 自带的

### 服务端
from xmlrpc.server import SimpleXMLRPCServer# 通信使用xml格式
class RPCServer(object):def add(self,a,b):return a+b# SimpleXMLRPCServer
server = SimpleXMLRPCServer(('localhost', 4242), allow_none=True)
server.register_introspection_functions()
server.register_instance(RPCServer())
server.serve_forever()#### 客户端
import time
from xmlrpc.client import ServerProxy# rpc 调用和http什么关系
'''
1 rpc 不是一种协议,它是一个概念:远程过程调用的概念,中间通过网络,底层可以基于tcp,也可以基于http,基于tcp自定制协议
2 有的rpc框架用了http协议
2 有的rpc框架直接使用tcp'''
# SimpleXMLRPCServer  底层使用了http协议,速度稍微慢一些
def xmlrpc_client():print('xmlrpc client')c = ServerProxy('http://localhost:4242')res=c.add(3,4)print('通过rpc执行结果是:',res)if __name__ == '__main__':xmlrpc_client()# 速度慢: 1 基于http  2 交互使用的xml格式

1.2 第三方ZeroRPC


### 服务端
import zerorpcclass RPCServer(object):def add(self,a,b):print('a+b',a+b)return a+b
# zerorpc
s = zerorpc.Server(RPCServer())
s.bind('tcp://0.0.0.0:4243')
s.run()#### 客户端
import zerorpc
import time# zerorpc
def zerorpc_client():print('zerorpc client')c = zerorpc.Client()c.connect('tcp://127.0.0.1:4243')print(c.add(88, 77))if __name__ == '__main__':zerorpc_client()

在这里插入图片描述

2 连接linux远程开发

# 咱么开发的环境-1 win 开发,linux上线-2 linux开发,Linux上线-乌班图-》台式机--》装乌班图--》乌班图开发-3 mac系统,linux上线-mac环境跟linxu很像# 只有win机器,没有linux,项目要在linux下开发---》远程连接到linux中开发---》解释器用了远程linux的# 使用pycharm远程连接linxu开发-本地代码传到linux-使用linux的解释器运行代码---》配置远端解释器-以后 在本地右键运行,实际上等同于,连到linux机器,执行# win---》远端docker容器中开发

在这里插入图片描述

3 分布式锁

# 分布式系统中加锁---》悲观锁-mysql  行锁   性能不高-性能更高的分布式锁# python 线程锁# 分布式锁具备条件
1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;
2、高可用的获取锁与释放锁;
3、高性能的获取锁与释放锁;
4、具备可重入特性;
5、具备锁失效机制,防止死锁;
6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败# 三种方式实现
基于数据库实现分布式锁---》行锁
基于缓存(Redis等)实现分布式锁;----redis官方提供
基于Zookeeper实现分布式锁:分布式协调服务

# pip3 install redlock-py
from redlock import Redlock
import time
dlm = Redlock([{"host": "localhost", "port": 6379, "db": 0}, ])# 获得锁
my_lock = dlm.lock("my_resource_name",1000)# 业务逻辑代码
print('sdfasdf')
time.sleep(20)# 释放锁
dlm.unlock(my_lock)# 这个代码可以放在任意的节点上,使用的是分布式锁,某个节点获取到锁后,别的节点获取不到,操作数据,释放锁后,别的节点的线程才能操作数据

3.1 自己基于redis实现分布式锁

#  redis 分布式锁底层如何实现的SETNX:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做expire:超过这个时间锁会自动释放,避免死锁delete:Redis实现分布式锁的时候删除锁import redis
import uuid
import timefrom threading import Thread,get_ident# 连接redis
redis_client = redis.Redis(host="localhost",port=6379,# password=password,db=10)# 获取一个锁
# lock_name:锁定名称
# acquire_time: 客户端等待获取锁的时间
# time_out: 锁的超时时间
def acquire_lock(lock_name, acquire_time=10, time_out=10):"""获取一个分布式锁"""identifier = str(uuid.uuid4())end = time.time() + acquire_timelock = "string:lock:" + lock_namewhile time.time() < end:if redis_client.setnx(lock, identifier):# 给锁设置超时时间, 防止进程崩溃导致其他进程无法获取锁redis_client.expire(lock, time_out)return identifierelif not redis_client.ttl(lock):redis_client.expire(lock, time_out)time.sleep(0.001)return False# 释放一个锁
def release_lock(lock_name, identifier):"""通用的锁释放函数"""lock = "string:lock:" + lock_namepip = redis_client.pipeline(True)while True:try:pip.watch(lock)lock_value = redis_client.get(lock)if not lock_value:return Trueif lock_value.decode() == identifier:pip.multi()pip.delete(lock)pip.execute()return Truepip.unwatch()breakexcept redis.excetions.WacthcError:passreturn Falsedef seckill():identifier = acquire_lock('resource')print(get_ident(), "获得了锁")release_lock('resource', identifier)if __name__ == '__main__':for i in range(50):t = Thread(target=seckill)t.start()

4 分布式id

# 在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识# 分布式id特点全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。  # uuid 趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求。信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所以在一些应用场景下,会需要ID无规则、不规则。# 生成分布式锁方案
-uuid :import timeimport uuidres=uuid.uuid1(2,int(time.time())) # b5503ec0-42ff-11ee-adb4-000000000002print(res)-数据自增:性能第-Redis生成ID时间戳+incr-snowflake(雪花算法)方案:pysnowflake雪花算法的使用场景就很明确了,用于确保全局唯一的id。还有一个从名字无法看出的特点就是,还能保证id的自增属性。Snowflake 以 64 bit 来存储组成 ID 的4 个部分:
1、最高位占1 bit,值固定为 0,以保证生成的 ID 为正数;
2、中位占 41 bit,值为毫秒级时间戳;
3、中下位占 10 bit,值为工作机器的 ID,值的上限为 10244、末位占 12 bit,值为当前毫秒内生成的不同 ID,值的上限为 4096-美团leaf算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/226412.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3-toRaw 和 markRaw 函数

Vue3-toRaw 和 markRaw 函数 toRaw(转换为原始)&#xff1a;将响应式对象转换为普通对象&#xff0c;只适用于 reactive 生成的响应式对象。markRaw(标记为原始)&#xff1a;标记某个对象&#xff0c;让这个对象永远都不具备响应式。一些集成的第三方库&#xff0c;会有大量的…

深入了解Java8新特性-日期时间API:OffsetDateTime类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概24000多字&#xff0c;预计阅读时间长需要20分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

【axios封装】万字长文,TypeScript实战,封装一个axios - 基础封装篇

目录 前言版本环境变量配置引入的类型1、AxiosIntance: axios实例类型2、InternalAxiosRequestConfig: 高版本下AxiosRequestConfig的拓展类型3、AxiosRequestConfig: 请求体配置参数类型4、AxiosError: 错误对象类型5、AxiosResponse: 完整原始响应体类型 目标效果开始封装骨架…

解读 | 从谷歌AI判定阿波罗登月“造假“来谈谈合成图片检测技术

大家好&#xff0c;我是极智视界&#xff0c;欢迎关注我的公众号&#xff0c;获取我的更多前沿科技分享 邀您加入我的知识星球「极智视界」&#xff0c;星球内有超多好玩的项目实战源码和资源下载&#xff0c;链接&#xff1a;https://t.zsxq.com/0aiNxERDq 整个事情可以爬楼看…

【数据库】基于排序算法的去重,集合与包的并,差,交,连接操作实现原理,执行代价以及优化

基于两趟排序的其它操作 ​专栏内容&#xff1a; 手写数据库toadb 本专栏主要介绍如何从零开发&#xff0c;开发的步骤&#xff0c;以及开发过程中的涉及的原理&#xff0c;遇到的问题等&#xff0c;让大家能跟上并且可以一起开发&#xff0c;让每个需要的人成为参与者。 本专栏…

数据结构代码更新中...

代码上传至gitee中&#xff0c;点击此处查看。 下面是思路的阐述 动态数组的实现 dynamicArray.h #pragma once#include <iostream> #include <string> #include <stdlib.h> using namespace std;typedef struct dynamicArray {void** pAddr;int capacit…

强化学习中的Q学习

Q学习&#xff08;Q-Learning&#xff09;是强化学习中的一种基于值的学习方法&#xff0c;用于在有限马尔可夫决策过程&#xff08;MDP&#xff09;中学习最优的动作策略。Q学习主要用于离散状态和离散动作的问题。 以下是Q学习的基本概念和步骤&#xff1a; Q-Value&#xf…

Python分享之字符串格式化 (%操作符)

在许多编程语言中都包含有格式化字符串的功能&#xff0c;比如C和Fortran语言中的格式化输入输出。Python中内置有对字符串进行格式化的操作%。 模板 格式化字符串时&#xff0c;Python使用一个字符串作为模板。模板中有格式符&#xff0c;这些格式符为真实值预留位置&#xff…

Redis 事件轮询

1 Redis 为什么快 数据存在内存中, 直接操作内存中的数据单线程处理业务请求避免了多线的上下文切换, 锁竞争等弊端使用 IO 多路复用支撑更高的网络请求使用事件驱动模型, 通过事件通知模式, 减少不必要的等待… 这些都是 Redis 快的原因。 但是这些到了代码层面是如何实现的呢…

【C++ Primer Plus学习记录】do while循环

do while循环是出口条件循环。这意味着这种循环将首先执行循环体&#xff0c;然后再判定测试表达式&#xff0c;决定是否应继续执行循环。如果条件为false&#xff0c;则循环终止&#xff1b;否则&#xff0c;进入新一轮的执行和测试。这样的循环通常至少执行一次&#xff0c;因…

sed命令

目录 一、sed 1.sed命令选项 2.语法选项 3.sed脚本格式 4.搜索替代 5.分组后向引用 1.提取版本号&#xff1a; 2.提取IP地址 3.提取数字权限 6.变量 二、免交互 1.多行重定向 2.免交互脚本 总结&#xff1a;本章主要介绍了seq和免交互的用法及相关知识 一、sed s…

通过网易的API完成一个简易的音乐播放器

效果图 工程环境 1、使用node在本地部署网易云音乐API接口 下载解压 链接:https://pan.baidu.com/s/1YQiMJoUMEYlMz14FH5xxRA?pwd36o5 提取码:36o5 工程目录概览 &#xff08;js文件夹里面放了music.html和main.js和vue.js&#xff09; 工程目录)&#xff08;有点重复…