首页 > 代码库 > 进程与线程之一
进程与线程之一
1.对于一个单进程的程序来说,我们打印十行数据,查看需要的时间
import timeimport 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 20161 Mon Aug 29 15:23:13 20162 Mon Aug 29 15:23:14 20163 Mon Aug 29 15:23:15 20164 Mon Aug 29 15:23:16 20165 Mon Aug 29 15:23:17 20166 Mon Aug 29 15:23:18 20167 Mon Aug 29 15:23:19 20168 Mon Aug 29 15:23:20 20169 Mon Aug 29 15:23:21 2016
2.但是当我们使用多线程来实现该程序的时候:
import timeimport threadingdef 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 20162 Mon Aug 29 15:24:35 20161 Mon Aug 29 15:24:35 20164 Mon Aug 29 15:24:35 20163 Mon Aug 29 15:24:35 20165 Mon Aug 29 15:24:35 20167 Mon Aug 29 15:24:35 20169 Mon Aug 29 15:24:35 20166 Mon Aug 29 15:24:35 20168 Mon Aug 29 15:24:35 2016
1、一个应用程序可以是多进程,多线程。
2、默认单进程、单线程
3、单进程、多线程执行,在IO操作(不使用CPU,例如音频,视频都交给相应驱动了)的时候执行效率高,计算性的操作(需要使用CPU)需要使用多进程
4、GIL(全局解释器锁)
通过setDaemon可以设置主进程是否等待子进程结束,默认情况请主进程等待子进程结束之后才结束
import timeimport 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 2016123 Mon Aug 29 20:25:50 2016
如果将程序中setDaemon(True),那么主进程在子进程还没有结束的时候就已经结束了。
import timeimport 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 2016123 Mon Aug 29 20:41:24 2016
t.join(2)说明最多等待线程2秒(默认会等待线程执行结束),等待2秒之后执行了主线程,然后子线程开始执行,最后程序退出。但是如果添加了setDeamon(True),那么先等待2秒,此时子进程还没有开始执行,程序就退出了。
线程的另外一种线程的创建方法,就是继承threading.Thread类
import threadingimport timeclass 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 2016579 Mon Aug 29 21:50:17 2016
obj.start()方法说明线程已经准备好了,这时候需要用CPU来调用obj.run()方法。
进程与线程之一
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。