解决的问题
分布式环境下,希望把用户的操作从并发执行变成原子执行案例:
将订单并发编程串行执行,相比悲观锁来说能够减少数据库的压力。
原理
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)
原文来源于:黑马程序员社区