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()方法。