首页 > 代码库 > 进程与线程之一

进程与线程之一

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

 

进程与线程之一