zoukankan      html  css  js  c++  java
  • python3 线程、进程

    线程、进程

    python由于有全局解释锁(GIL)的原因,Python 的线程被限制到同一时刻只允许一个线程执行这样一个执行,所以妨碍了其真正的使用功效,但是对于IO型程序并没有多少影响,后续说解决办法

    线程(对于IO密集型程序可以大幅提高程序运行速度,减少执行时间)

    python3 目前推荐使用threading

    import time
    
    
    start = time.time()
    
    def look_thread(name):
        for i in range(5):
            time.sleep(0.5)
            print('主程序{}运行'.format(name))
    
    look_thread('1')
    look_thread('2')
    end = time.time()
    print(end-start)

    这个是无线程运行后输出的结果以及所花费的时间

    主程序1运行
    主程序1运行
    主程序1运行
    主程序1运行
    主程序1运行
    主程序2运行
    主程序2运行
    主程序2运行
    主程序2运行
    主程序2运行
    5.005494832992554

    接下来看看使用线程后的程序

    import threading
    import time
    from threading import Thread
    
    
    start = time.time()
    def look_thread(name):
        for i in range(5):
            time.sleep(0.5)
            # print('主程序{}运行'.format(name))
            print("线程{}正在运行".format(name))
    
    t1 = Thread(target=look_thread,args=('1',)) #创建线程1
    t2 = Thread(target=look_thread,args=('2',)) #创建线程2
    #t1 = Thread(target=look_thread,args=('1',),daemon=True) #如果不喜欢使用join可以使用保护线程
    #t2 = Thread(target=look_thread,args=('2',),daemon=True) #创建线程2
    t1.start() #启动线程1
    t2.start() #启动线程2
    print(threading.active_count()) #现存线程数
    t1.join() #将线程1加入到当前线程
    t2.join() #将线程2加入到当前线程
    print(threading.active_count()) #现存线程数
    end = time.time() 
    print(end-start) #运行时间

    结果如下

    3
    线程1正在运行
    线程2正在运行
    线程1正在运行
    线程2正在运行
    线程1正在运行
    线程2正在运行
    线程1正在运行
    线程2正在运行
    线程1正在运行
    线程2正在运行
    1
    2.504371404647827

    2个对比可以看出,明显不是按照持续执行,且线程数的变化和运行时间的减半

    进程(建议在cpu密集型程序使用)

    python3 使用multiprocessing,使用方法同threading

    import time
    from multiprocessing import Process
    start = time.time()
    def look_thread(name):
        for i in range(5):
            time.sleep(0.5)
            # print('主程序{}运行'.format(name))
            print("进程{}正在运行".format(name))
    if __name__ == "__main__":
        t1 = Process(target=look_thread,args=('1',))
        t2 = Process(target=look_thread,args=('2',))
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        end = time.time()
        print(end-start)

    结果如下

    进程1正在运行
    进程2正在运行
    进程2正在运行进程1正在运行
    
    进程1正在运行
    进程2正在运行
    进程1正在运行进程2正在运行
    
    进程2正在运行
    进程1正在运行
    2.7984180450439453

    参考书籍:python3-cookbook

     

  • 相关阅读:
    关于以追加模式写入文件时,为什么第一行是空行?
    使用正则表达式的技巧
    super关键字的三种用法
    Excel快捷键
    重载与重写的区别
    方法重名
    区分子类方法中重名的三种变量
    继承
    Chapter08【String类、static、Arrays类、Math类】
    Math类
  • 原文地址:https://www.cnblogs.com/jay-col/p/11008836.html
Copyright © 2011-2022 走看看