zoukankan      html  css  js  c++  java
  • python-threading学习笔记(一)

    1、python中一个线程对应于C语言中的一个线程。

    2、GIL使得同一时刻只有一个线程在一个cpu上执行字节码,无法将多个线程映射到多个cpu上执行。

    3、GIL会根据执行的字节码行数以及时间片释放GIL,GIL在遇到io操作时会主动释放。

    import threading
    import time
    def func_one():
        print("start_func_one")
        time.sleep(2)
        print("end_func_one")
    
    def func_two():
        print("start_func_two")
        time.sleep(4)
        print("end_func_two")
    
    if __name__ == "__main__":
        thread1 = threading.Thread(target=func_one)
        thread2 = threading.Thread(target=func_two)
        start_time =time.time()
        thread1.start()
        thread2.start()
        print("time:{}".format(time.time() - start_time))

    根据执行结果,可以看到时间上不对,这是因为这儿计算的是主线程的执行时间,上面除了thread1和thread2 两个线程,还有个主线程,这儿计算的是主线程的时间。

    (zabbixweb) D:datapythonzabbixapiwebprojectproject>d:/data/python/environment/zabbixweb/Scripts/python.exe d:/data/python/zabbixapiweb/project/project/test13.py     
    start_func_one
    start_func_two
    time:0.0009965896606445312
    end_func_one
    end_func_two
     thread1.setDaemon(True)
     thread2.setDaemon(False)
    import threading
    import time
    def func_one():
        print("start_func_one")
        time.sleep(2)
        print("end_func_one")
    
    def func_two():
        print("start_func_two")
        time.sleep(4)
        print("end_func_two")
    
    if __name__ == "__main__":
        thread1 = threading.Thread(target=func_one)
        thread2 = threading.Thread(target=func_two)
        #把子线程设置成守护线程(表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。
        #这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免传说中的孤儿进程。),
        #即主线程终止时,守护也会终止,不管子线程运行到哪一步。 True表示置该线程为守护线程.
        thread1.setDaemon(True)
        thread2.setDaemon(False)
        start_time =time.time()
        thread1.start()
        thread2.start()
        # thread2.join()
        print("time:{}".format(time.time() - start_time))
    (zabbixweb) D:datapythonzabbixapiwebprojectproject>d:/data/python/environment/zabbixweb/Scripts/python.exe d:/data/python/zabbixapiweb/project/project/test13.py     
    start_func_one
    start_func_two
    time:0.0009694099426269531
    end_func_one
    end_func_two
        thread1.setDaemon(False)
        thread2.setDaemon(True)
    import threading
    import time
    def func_one():
        print("start_func_one")
        time.sleep(2)
        print("end_func_one")
    
    def func_two():
        print("start_func_two")
        time.sleep(4)
        print("end_func_two")
    
    if __name__ == "__main__":
        thread1 = threading.Thread(target=func_one)
        thread2 = threading.Thread(target=func_two)
        #把子线程设置成守护线程(表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。
        #这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免传说中的孤儿进程。),
        #即主线程终止时,守护也会终止,不管子线程运行到哪一步。 True表示置该线程为守护线程.
        thread1.setDaemon(False)
        thread2.setDaemon(True)
        start_time =time.time()
        thread1.start()
        thread2.start()
        # thread2.join()
        print("time:{}".format(time.time() - start_time))
    (zabbixweb) D:datapythonzabbixapiwebprojectproject>d:/data/python/environment/zabbixweb/Scripts/python.exe d:/data/python/zabbixapiweb/project/project/test13.py     
    start_func_one
    start_func_two
    time:0.0009641647338867188
    end_func_one
        #join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,
        #一直等待该线程执行结束后,主线程再终止。
        thread1.join()
    import threading
    import time
    def func_one():
        print("start_func_one")
        time.sleep(2)
        print("end_func_one")
    
    def func_two():
        print("start_func_two")
        time.sleep(4)
        print("end_func_two")
    
    if __name__ == "__main__":
        thread1 = threading.Thread(target=func_one)
        thread2 = threading.Thread(target=func_two)
        #把子线程设置成守护线程(表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。
        #这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免传说中的孤儿进程。),
        #即主线程终止时,守护也会终止,不管子线程运行到哪一步。 True表示置该线程为守护线程.
        # thread1.setDaemon(False)
        # thread2.setDaemon(True)
        start_time =time.time()
        thread1.start()
        thread2.start()
        #join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,
        #一直等待该线程执行结束后,主线程再终止。
        thread1.join()
        print("time:{}".format(time.time() - start_time))
    (zabbixweb) D:datapythonzabbixapiwebprojectproject>d:/data/python/environment/zabbixweb/Scripts/python.exe d:/data/python/zabbixapiweb/project/project/test13.py     
    start_func_one
    start_func_two
    end_func_one
    time:2.0020813941955566
    end_func_two
    thread2.join()
    import threading
    import time
    def func_one():
        print("start_func_one")
        time.sleep(2)
        print("end_func_one")
    
    def func_two():
        print("start_func_two")
        time.sleep(4)
        print("end_func_two")
    
    if __name__ == "__main__":
        thread1 = threading.Thread(target=func_one)
        thread2 = threading.Thread(target=func_two)
        #把子线程设置成守护线程(表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。
        #这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免传说中的孤儿进程。),
        #即主线程终止时,守护也会终止,不管子线程运行到哪一步。 True表示置该线程为守护线程.
        # thread1.setDaemon(False)
        # thread2.setDaemon(True)
        start_time =time.time()
        thread1.start()
        thread2.start()
        #join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,
        #一直等待该线程执行结束后,主线程再终止。
        thread2.join()
        print("time:{}".format(time.time() - start_time))
    (zabbixweb) D:datapythonzabbixapiwebprojectproject>d:/data/python/environment/zabbixweb/Scripts/python.exe d:/data/python/zabbixapiweb/project/project/test13.py     
    start_func_one
    start_func_two
    end_func_one
    end_func_two
    time:4.001985549926758
    import time,threading
    """通过共享变量实现线程间通信坏处是变量通信不安全,因为不能控制线程间执行顺序共享变量多了,也不好维护。
        """
    detail_list = []
    
    
    def get_detail_html():
        global detail_list
        print(detail_list)
        print("detail_list_len",len(detail_list))
        print("start get detail html")
        time.sleep(4)
        print("end get detail html")
    
    
    def get_detail_url():
        global detail_list
        print("start get detail url")
        for x in range(1000):
            detail_list.append("http://www.qq.com/{id}".format(id=x))
        print("end get detail url")
    
    if __name__ == "__main__":
        thread1 = threading.Thread(target=get_detail_url)
        thread2 = threading.Thread(target=get_detail_html)
        #把子线程设置成守护线程(表示该线程是不重要的,进程退出时不需要等待这个线程执行完成。
        #这样做的意义在于:避免子线程无限死循环,导致退不出程序,也就是避免传说中的孤儿进程。),
        #即主进程终止时,守护也会终止,不管子线程运行到哪一步。 True表示置该线程为守护线程.
        # thread1.setDaemon(False)
        # thread2.setDaemon(True)
        start_time =time.time()
        thread1.start()
        thread2.start()
        #join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,
        #一直等待该线程执行结束后,主线程再终止。
        # thread2.join()
        # print("time:{}".format(time.time() - start_time))
  • 相关阅读:
    ABAP接口用法
    监听textarea数值变化
    The first step in solving any problem is recognizing there is one.
    Wrinkles should merely indicate where smiles have been.
    God made relatives.Thank God we can choose our friends.
    Home is where your heart is
    ABAP跳转屏幕
    Python 工具包 werkzeug 初探
    atom通过remote ftp同步本地文件到远程主机的方法
    Mongodb学习笔记一
  • 原文地址:https://www.cnblogs.com/laonicc/p/14427542.html
Copyright © 2011-2022 走看看