程序员

首页 » 常识 » 诊断 » 黑马程序员python语言下通过redi
TUhjnbcbe - 2024/5/8 11:15:00

解决的问题

分布式环境下,希望把用户的操作从并发执行变成原子执行案例:

将订单并发编程串行执行,相比悲观锁来说能够减少数据库的压力。

原理

redis是单线程的,并发过来的请求,redis都会让他们排队串行执行,redis内部是线程安全的

实现的代码

考虑到如果下单出现异常则锁将永远无法释放,因此做异常捕获,无论代码是否异常要释放锁

考虑到如果下单过程中服务器宕机,则锁将永远无法释放

方案一:应用开始起置空redis中的lock

方案二:给锁设置过期时间,但是如果用户的下单操作超过了lock的过期时间,则下单没有完成锁就失效了。过期时间设置的太长宕机立刻重启问题也解决不了

#解决方案启动一个子线程,每过2s给锁重设过期时间,主线程执行结束,则销毁子线程

销毁线程的代码

fromthreadingimportThreadimportinspectimportctypesdef_async_raise(tid,exctype):raisestheexception,performscleanupifneededtid=ctypes.c_long(tid)ifnotinspect.isclass(exctype):exctype=type(exctype)res=ctypes.pythonapi.PyThreadState_SetAsyncExc(tid,ctypes.py_object(exctype))ifres==0:raiseValueError(invalidthreadid)elifres!=1:#ifitreturnsanumbergreaterthanone,youreintrouble,#andyoushouldcallitagainwithexc=NULLtoreverttheeffectctypes.pythonapi.PyThreadState_SetAsyncExc(tid,None)raiseSystemError(PyThreadState_SetAsyncExcfailed)defstop_thread(thread):_async_raise(thread.ident,SystemExit)defa():whileTrue:print()if__name__==__main__:t=Thread(target=a)t.start()stop_thread(t)

原文来源于:黑马程序员社区

1
查看完整版本: 黑马程序员python语言下通过redi