进程与线程之一

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

原文地址:https://www.cnblogs.com/python-study/p/5818476.html