zoukankan      html  css  js  c++  java
  • 进程与线程之一

    1.对于一个单进程的程序来说,我们打印十行数据,查看需要的时间

    import time
    import threading
    # print (time.ctime())
    
    def f1(i):
        time.sleep(1)
        print (i,time.ctime())
    
    for i in range(10):
        f1(i)

    打印出结果:

    0 Mon Aug 29 15:23:12 2016
    1 Mon Aug 29 15:23:13 2016
    2 Mon Aug 29 15:23:14 2016
    3 Mon Aug 29 15:23:15 2016
    4 Mon Aug 29 15:23:16 2016
    5 Mon Aug 29 15:23:17 2016
    6 Mon Aug 29 15:23:18 2016
    7 Mon Aug 29 15:23:19 2016
    8 Mon Aug 29 15:23:20 2016
    9 Mon Aug 29 15:23:21 2016

    2.但是当我们使用多线程来实现该程序的时候:

    import time
    import threading
    
    def f1(i):
        time.sleep(1)
        print (i,time.ctime())
    
    for i in range(10):
        t = threading.Thread(target=f1,args=(i,))
        t.start()

    我们查看到结果是无序的切时间上是同一时间执行的:

    0 Mon Aug 29 15:24:35 2016
    2 Mon Aug 29 15:24:35 2016
    1 Mon Aug 29 15:24:35 2016
    4 Mon Aug 29 15:24:35 2016
    3 Mon Aug 29 15:24:35 2016
    5 Mon Aug 29 15:24:35 2016
    7 Mon Aug 29 15:24:35 2016
    9 Mon Aug 29 15:24:35 2016
    6 Mon Aug 29 15:24:35 2016
    8 Mon Aug 29 15:24:35 2016

     1、一个应用程序可以是多进程,多线程。

     2、默认单进程、单线程

     3、单进程、多线程执行,在IO操作(不使用CPU,例如音频,视频都交给相应驱动了)的时候执行效率高,计算性的操作(需要使用CPU)需要使用多进程

     4、GIL(全局解释器锁)

     通过setDaemon可以设置主进程是否等待子进程结束,默认情况请主进程等待子进程结束之后才结束

    import time
    import threading
    # print (time.ctime())
    
    def f1(i):
        time.sleep(3)
        print (i,time.ctime())
    
    t = threading.Thread(target=f1,args=(123,))
    t.start()
    
    print ("waiting...",time.ctime())

    结果可以看到子进程很快执行完成,但是过了3秒之后子进程才结束,然后程序才结束执行。

    waiting... Mon Aug 29 20:25:47 2016
    123 Mon Aug 29 20:25:50 2016

    如果将程序中setDaemon(True),那么主进程在子进程还没有结束的时候就已经结束了。

    import time
    import threading
    # print (time.ctime())
    
    def f1(i):
        time.sleep(3)
        print (i,time.ctime())
    
    t = threading.Thread(target=f1,args=(123,))
    t.setDaemon(True) t.start()
    print ("waiting...",time.ctime())

    那么执行的时候主进程已经结束了,子进程还在后台运行。

    join函数用来确定主线程的等待时间

    def f1(i):
        time.sleep(3)
        print (i,time.ctime())
    
    t = threading.Thread(target=f1,args=(123,))
    # t.setDaemon(True)
    t.start()
    t.join(2)
    
    
    print ("waiting...",time.ctime())

    执行结果:

    waiting... Mon Aug 29 20:41:23 2016
    123 Mon Aug 29 20:41:24 2016

    t.join(2)说明最多等待线程2秒(默认会等待线程执行结束),等待2秒之后执行了主线程,然后子线程开始执行,最后程序退出。但是如果添加了setDeamon(True),那么先等待2秒,此时子进程还没有开始执行,程序就退出了。

    线程的另外一种线程的创建方法,就是继承threading.Thread类

    import threading
    import time
    
    class MyThread(threading.Thread):
    
        def __init__(self,func,args1,args2):
            self.func = func
            self.args1 = args1
            self.args2 = args2
            super(MyThread,self).__init__()
    
        def run(self):
            time.sleep(2)
            self.func(self.args1,self.args2)
    
    def f2(args1,args2):
        print (args1 + args2,time.ctime())
    
    obj = MyThread(f2,123,456)
    obj.start()
    
    f2(234,456)

    执行结果:

    690 Mon Aug 29 21:50:15 2016
    579 Mon Aug 29 21:50:17 2016

    obj.start()方法说明线程已经准备好了,这时候需要用CPU来调用obj.run()方法。

  • 相关阅读:
    夜空中最亮的星
    让我留在你身边
    反思
    又想起民谣那诗
    初学积性函数
    P1049 装箱问题(01背包)
    set
    紫书 习题 10-4 UVa 1644(素数筛)
    紫书 习题 10-2 UVa 808(建立坐标+找规律)
    紫书 习题 10-1UVa 111040(找规律)
  • 原文地址:https://www.cnblogs.com/python-study/p/5818476.html
Copyright © 2011-2022 走看看