• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    python子线程如何有序执行

    一、前情提要

    最近在写一个项目,需要用到子线程,但是我们小学二年级就学过操作系统, 线程的执行是由系统的CPU调度算法所决定的,调度算法按照一系列的要求来从 就绪队列中 选择合适的线程分配CPU资源。

    二、场景重现

    好了,换句话说,线程的执行顺序是不确定的。来个python代码我们看一下:

    import threading
    
    def fun():
        '''执行函数'''
        print(threading.current_thread().getName()+' 正在执行!')
    
    # 线程队列
    ths = []
    for i in range(10):
        ths.append(threading.Thread(target=fun))
    # 依次启动线程
    for th in ths:
        th.start()
    

    看一下效果:

    不难看出,虽然第一次运行的结果时有序执行子线程,但是后续重复运行程序的结果,显然是顺序不确定的, 这就正好体现了线程的随机性。

    那么我们在某种特殊的场景下,我们需要让子线程按照顺序有序执行,那改怎么做呢?

    三、解决方案(一)

    通过查询threading API我们可以发现一个这样的函数:

    Thread.join(timeout=None)

    该方法的作用是等待当前执行线程终止

    也就是说,哦那我调用start()方法开始线程之后,再调用这个方法不就行了吗?答案是肯定的

    import threading
    
    def fun():
        '''执行函数'''
        print(threading.current_thread().getName()+' 正在执行!')
    
    # 线程队列
    ths = []
    for i in range(10):
        ths.append(threading.Thread(target=fun))
    # 依次启动线程
    for th in ths:
        th.start()
        th.join()
    

    看一下效果:

    这时候我们发现,不管如何运行子线程的执行顺序都是有序的

    四、解决方案(二)

    就这一种方法吗?当然不是的,而且上面那种方法,如果是控制台界面是没有问题的,但是如果是GUI界面,那就由大问题了。

    那么我们再想想join()方法,还可以换种方法用吗?

    我们可以用一个小技巧,可以将上一个线程传入target,

    在函数中判断,如果上一个线程还在执行,那么就调用join()方法等待其执行,等待执行完毕后,再让当前线程执行。

    代码:

    import threading
    
    def fun(preThread):
        '''执行函数'''
        # 等待上一个线程执行完毕
        if preThread != None:
            preThread.join()
        # 执行当前线程
        print(threading.current_thread().getName()+' 正在执行!')
    
    # 线程队列
    ths = []
    for i in range(10):
        if i == 0:
            ths.append(threading.Thread(target=fun, args=(None, )))
        else :
            ths.append(threading.Thread(target=fun, args=(ths[-1], )))
    # 依次启动线程
    for th in ths:
        th.start()
    

    看一下效果:

    这个时候,我们发现,子线程的执行顺序也是有序的!Nice!

    五、结束

    通过以上两种解决方案,完美解决这个问题!

    到此这篇关于python子线程如何有序执行的文章就介绍到这了,更多相关python子线程有序执行内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    您可能感兴趣的文章:
    • 解决python父线程关闭后子线程不关闭问题
    • Python 多线程,threading模块,创建子线程的两种方式示例
    • 如何用 Python 子进程关闭 Excel 自动化中的弹窗
    • python清理子进程机制剖析
    • python使用Queue在多个子进程间交换数据的方法
    • Python的子线程和子进程是如何手动结束的?
    上一篇:详解Python装饰器之@property
    下一篇:Pytorch中的gather使用方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    python子线程如何有序执行 python,子,线程,如何,有序,