美文网首页
Python串行执行

Python串行执行

作者: ayuLiao | 来源:发表于2018-12-18 09:08 被阅读0次


正文共: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具有顺序的特性,将方法强行串行执行,让强依赖方法之间的正常使用。

相关文章

  • Python串行执行

    正文共:1566字 预计阅读时间:4分钟 工作中遇到一个需求就是必须顺序执行完一些python方法,这些方法其原理...

  • 关于多线程GCD 串行/并行、同步/异步

    一、GCD串行/并行队列创建 串行队列: 并行队列: 二、GCD串行/并行队列同步/异步执行 执行内容1: 执行结...

  • NSOperation

    1.简单了解 先来了解一下串行和并行 串行和并行描述的是任务和任务之间的执行方式 串行是任务A执行完了任务B才执行...

  • iOS 多线程-CGD

    串行队列同步执行,不开启新线程,任务按顺序执行 串行队列异步执行,会开启新线程(1个),任务按照顺序执行 并行队列...

  • iOSIN-GCD

    队列和同步异步 区别并行队列串行队列主队列同步(sync)没有开启新线程,串行执行任务没有开启新线程,串行执行任务...

  • iOS开发-队列和同步异步执行的结果分析

    多线程中的队列有:串行队列,并发队列,全局队列(并发),主队列(串行)。 执行的方法有:同步执行和异步执行。 提到...

  • iOS GCD笔记

    串行队列 并发队列 主队列 全局并发队列 同步执行 异步执行 同步+并发队列 = 没有开启新线程,串行执行任务 s...

  • iOS GCD随记(一)任务/队列组合

    1.同步执行+串行队列2.同步执行+并行队列3.异步执行+串行队列4.异步执行+并行队列5.同步执行+主队列6.异...

  • iOS多线程:『GCD』详尽总结(四):异步执行 + 串行队列

    4.4 异步执行 + 串行队列 在异步执行 + 串行队列可以看到: 开启了一条新线程(异步执行具备开启新线程的能力...

  • iOS - 多线程(二) GCD讲解

    目录: 1.GCD简介2.串行队列 + 同步执行3.串行队列 + 异步执行4.并发队列 + 同步执行5.并发队列 ...

网友评论

      本文标题:Python串行执行

      本文链接:https://www.haomeiwen.com/subject/qjkkkqtx.html