Python串行执行


正文共:1566 字

预计阅读时间: 4 分钟

工作中遇到一个需求就是必须顺序执行完一些python方法,这些方法其原理都是调用原本就有的shell命令对系统进行相关的操作,但每个shell命令之间是有比较强的依赖的,比如B脚本要正常执行,就必须先成功执行了A脚本,此时就必须在逻辑上确保A脚本对应的python方向比B脚本对应的python方法是先执行的。

虽然说python本身是单线程的,但因为原本开发的python系统比较复杂,所以为了确保绝对的串行运行,需要显示的通过相应的逻辑来保证,这是使用锁的一个绝佳处境。

锁的运用

锁的朴素原理很简单,一个资源被锁锁住了,其他进程没有相应的钥匙就无法获得这个资源,如果该进程一定需要这个资源,那么就需要等待其他拥有锁的进程使用完后,释放出来给自己,然后才能继续执行。

那为了实现逻辑上的串行调用,利用锁就可以轻松实现,依旧是A脚本对应的方法A要比B脚本对应的方法B先调用,那么方法A调用时,将资源使用锁锁住,只用正在使用该资源的方法A具有锁的钥匙,只有等方法A执行完,释放锁后,方法B才能获得钥匙去调用相应的锁。

这里通过threading中的Lock来实现一个锁,通过装饰器的写法实现一个装饰器,实现对方法加锁,如果方法没有执行完,锁就不会释放,此时其他方法就不能继续执行。具体代码如下:

  1. from threading import Lock


  2. # Program Lock. Program running when it get the program lock

  3. lock = Lock()

  4. def use_lock(func):

  5.    def wrapper(*args, **kwargs):

  6.        # get lock

  7.        if lock.acquire():

  8.            try:

  9.                print('%s [%f]'%(func.__name__, time.time()))

  10.                return func(*args, **kwargs)

  11.                print('%s [%f]' % (func.__name__, time.time()))

  12.            except:

  13.                print('func [%s] error'%(func.__name__))

  14.                raise

  15.            finally:

  16.                # release lock, avoid dead lock

  17.                lock.release()

  18.    return wrapper

使用的使用,如下:

  1. @use_lock

  2. def _start(self, mode):

  3. ...

为了确保python是串行运行对应的方法的,这里使用list将方法存放起来,然后顺序传参调用,因为调用的方法被use_lock装饰器装饰了,所以当第一个方法在运行时,第二个方法是无法运行的,而且通过顺序获取list中方法的方式,也很好的提现串行执行的想法,具体代码如下:

  1. def startServer(self):

  2.   '''

  3.   first, start ssdb

  4.   second, start sgame

  5.   :return:

  6.   '''

  7.   try:

  8.       #顺序调用有所的方法

  9.       funcs = [self._start, self._start]

  10.       #参数

  11.       params = [('xxx1',), ('xxx2',)]

  12.       # sequential execute

  13.       for funcp in zip(funcs, params):

  14.           code,info = funcp[0](*funcp[1])


  15.           if code == errorcode:

  16.               return rt_pt(errorcode, 'ssdb and sgame start fail')

  17.       return rt_pt(successcode, 'ssdb and sgame start success')

  18.   except:

  19.       print(traceback.print_exc())

  20.       return rt_pt(errorcode, 'ssdb and sgame start fail')

小结

通过锁和list具有顺序的特性,将方法强行串行执行,让强依赖方法之间的正常使用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 12,972评论 0 13
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 11,200评论 0 10
  • Python 面向对象Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对...
    顺毛阅读 9,673评论 4 16
  • 感恩太阳的照耀,温暖冬日的人们!祈愿冬日里每个人都暖暖的。 感恩金钱宝贝为我所用,让我有暖和的被窝与衣衫!祈愿全世...
    椿芽儿香阅读 1,183评论 0 1
  • 不知不觉已经工作了十几年了,从职校毕业,跌跌撞撞,经历过不少,到现在已经是外资银行的助理经理,小康不算,至少是温饱...
    惊闻语阅读 2,490评论 0 0