进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的工具,是操作系统结构的基础。而线程又被称为轻量级进程,是程序中一个单一的顺序控制流程,进程内一个相对独立,可调度的执行单元,是系统独立调度和分派CPU的基本单元。线程自身只拥有一点在运行中必不可少的资源,例如程序计数器,一组寄存器和栈空间等,但可以和同属一个进程的其它线程共享进程所拥有的全部资源。
python程序默认使用单线程。
代码如下:
from time import sleep, time
def play(thing, t):
print('I play %s %s seconds' % (thing, t))
sleep(t) # 推迟调用线程执行的秒数
def study(thing, t):
print('I study %s %s seconds' % (thing, t))
sleep(t)
if __name__ == '__main__':
start_time = time() #返回一个当前时间的时间戳,从1970年开始计时,单位秒
play('computer', 3)
study('English', 3)
end_time = time()
print('I spend all %s seconds' % (end_time - start_time))
执行结果:从代码中可以看出,程序先执行了play函数,然后休眠3秒钟,接着执行study函数,再休眠3秒钟,最终用时约6秒左右(包括程序本身运行花费的时间以及程序休眠的时间)
如果使用了多线程,则意味着play函数与study函数可以同时执行,这样在本例中将节省将近一半的时间。
代码如下:from time import time, sleep
from threading import Thread
def play(thing, t):
print('I play %s %s seconds' % (thing, t))
sleep(t)
def study(thing, t):
print('I study %s %s seconds' % (thing, t))
sleep(t)
if __name__ == '__main__':
threads = []
start_time = time()
t1 = Thread(target = play, args = ('computer', 3)) # 创建线程target传递方法或者函数, args传递参数,是元组类型
threads.append(t1)
t2 = Thread(target = study, args = ('English', 3))
threads.append(t2)
for t in threads:
t.setDaemon(True) # 将线程设置为守护线程,须在start方法前设置,不设置则线程会被无限挂起
t.start() # 线程开始活动
t.join() # join方法将使父线程一直阻塞,直到子线程全部完成运行由于
# 若没有该方法,则同一时间启动,主线程执行结束后,所有子线程也会一同结束掉
end_time = time()
print('I spend all %s seconds' % (end_time - start_time))
执行结果:
补充一点,使用__name__和__main__的知识,在Python中,当一个模块作为整体被执行时,module.__name__的值是__main__,而被其它模块所导入时,则module.__name__的值为模块自身的名字。