• python之路——多线程


    1、多线程模块 import threading

    2、用函数写一个多线程例子

    import threading,time
    def talk(name):
        print(name,"is tlaking",threading.current_thread(),threading.active_count())
        time.sleep(2)
        print("thread done ....",name)
    
    p1 = threading.Thread(target=talk,args = ("alex",))
    p2 = threading.Thread(target=talk,args = ("japhi",))
    p1.start()
    p2.start()
    

      结果是:

    alex is tlaking <Thread(Thread-1, started 5680)> 2
    japhi is tlaking <Thread(Thread-2, started 4592)> 3
    thread done .... alex
    thread done .... japhi

    其中threading.current_thread() 用来打印当前的线程,threading.active_count()打印线程数,结果是一起运行。

    3、用面向对象的方式写一个多线程

    import threading,time
    class Mythread(threading.Thread):
        def __init__(self,name):
            super(Mythread,self).__init__()
            self.name = name
        def run(self):                                  #必须是run
            print(self.name,"is tlaking")
            time.sleep(2)
    
    p3 = Mythread("alex")
    p4 = Mythread("japhi")
    p3.start()
    p4.start()
    

      但是,面向对象的形式中的方法名必须是run

    4、join()方法

      join方法是指当前线程执行完才能继续执行下一个线程,代码示例

    import threading,time
    start_time = time.time()
    def talk(name):
        print(name,"is tlaking",threading.current_thread(),threading.active_count())
        time.sleep(2)
        print("thread done ....",name)
    p1 = threading.Thread(target=talk,args = ("alex",))
    p2 = threading.Thread(target=talk,args = ("japhi",))
    p1.start()
    p1.join()
    p2.start()
    print("cost:",time.time() - start_time)
    

    结果是:

    先打印:alex is tlaking <Thread(Thread-1, started 3444)> 2
    2秒后。。。
    打印:thread done .... alex
    japhi is tlaking <Thread(Thread-2, started 11988)> 2
    cost: 2.0001144409179688
    2秒后打印:thread done .... japhi

      等1线程执行完后才执行线程2

    4、以一个循环的例子:

    import threading,time
    start_time = time.time()
    def talk(name):
        print(name,"is tlaking",threading.current_thread(),threading.active_count())
        time.sleep(2)
        print("thread done ....",name)
    res = []
    for i in range(10):
        p1 = threading.Thread(target=talk,args = (i,))    #多线程并发,target是任务,args是参数,参数后面一定要加,
        p1.setDaemon(True)  # 把当前线程变为守护线程
        p1.start()
        res.append(p1)
    for obj in res:
        obj.join()
    
    print("cost:",time.time() - start_time)
    

      计算10个线程都结束后花的时间,结果是cost: 2.0021145343780518

    5、守护线程

      t.setDaemon(True)   将t这个线程设为守护线程,主线程代码结束后不会等t线程是否结束,直接退出程序

    import threading,time
    start_time = time.time()
    def talk(name):
        print(name,"is tlaking",threading.current_thread(),threading.active_count())
        time.sleep(2)
        print("thread done ....",name)
    for i in range(10):
        p1 = threading.Thread(target=talk,args = (i,))    #多线程并发,target是任务,args是参数,参数后面一定要加,
        p1.setDaemon(True)  # 把当前线程变为守护线程
        p1.start()
    print("cost:",time.time() - start_time)
    

      结果是:

  • 相关阅读:
    JS中的getter与setter
    Node.js中exports与module.exports的区别
    JS中的匿名函数自执行、函数声明与函数表达式
    JS实现千分位
    JS中的new操作符原理解析
    JS中null与undefined的区别
    JavaScript中callee与caller,apply与call解析
    解决vue路由与锚点冲突
    jQuery中deferred的对象使用
    Vue的生命周期
  • 原文地址:https://www.cnblogs.com/japhi/p/7010806.html
Copyright © 2020-2023  润新知