1、进程与线程
程序包括进程,进程包括线程。
一个程序,至少包括一个进程,因为进程是一个执行特定的功能、具有自己独立的内存资源空间、系统进行资源调度和分配的独立单位。这样来说吧,可以把你的程序.py看做一个进程,符合以上的条件,对不对?但是,也可以这样来看,把你的程序.py看成几个进程的集合,或许这些进程之间相互独立,互不干扰,又或许某些进程结束后,另一些进程才能开始,就像某些函数,一个函数必须依赖另一个函数才能执行,那么这两个函数就可以看做两个进程啊。
一个进程,至少包括一个线程。线程的出现是为了做到计算机的并发处理,一个进程可以包括多个线程,多个线程之间共享同一个进程的内存资源,比如:一个程序F为一个进程,F中有读文件函数R1~R5和写文件函W1~W5,那么Ri和Wi便可以当做多个线程,比如现在要复制一个文件夹fileA的5个文件file1~file5内容到文件夹fileB中,一般的做法是先复制文件file1,然后file2……,所需时间为复制5个文件的时间和;其实我们把Wi和Ri当做线程之后,这5个文件的复制便可以同步进行,所需时间为最大文件的复制时间。
2、threading模块
截图如下:
这里我们介绍类Thread的用法和如何开启线程和关闭线程:
Thread类有以下几个方法:
start()#开启线程的执行
run()#定义线程的功能函数,一旦线程被开启,功能函数自动开始执行,一般会被子类改写
join(timout=None)#程序挂起,就是在join()函数后等待线程的执行结束才执行join()函数以后的程序的内容,如果给定了timeout(不为None),则程序最多挂起时间为timeout,否则一直等到所有线程结束。
getName()#返回线程的名字
setName(name)#设置线程的名字
isAlive()#线程正在运行返回True,否则返回False
isDaemon()#返回线程的Daemon标志
setDaemon(daemon)#设置线程的Daemon标志为daemon,一定要在start()函数执行前执行
找段程序介绍一下它们的用法:(程序如下)
1 #!/usr/bin/env python '''这一句是告诉系统Python解释器在这个位置'''
2
3 import threading '''这一句是导入了模块threading,一般为了下边使用方便,写成:from threading import * 表示导入模块threading中的所有方法或者变量或者对象。 '''
4 from time import sleep, ctime '''这一句是导入了模块time中的sleep()和ctime()两个函数'''
5
6 loops = [4,2] '''指定睡眠时间列表,供函数使用'''
7
8 def loop(nloop, nsec): '''定义睡眠函数(循环函数)'''
9 print 'start loop', nloop, 'at:', ctime() '''ctime()函数返回当前的时间,精确到秒,此为开始时间'''
10 sleep(nsec) '''执行睡眠函数'''
11 print 'loop', nloop, 'done at:', ctime() '''此为结束时间'''
12
13 def main(): '''定义main函数'''
14 print 'starting at:', ctime()
15 threads = [] '''建立线程列表'''
16 nloops = range(len(loops))
17
18 for i in nloops: '''循环建立线程,并且加入线程表threads中去'''
19 t = threading.Thread(target=loop, args=(i, loops[i])) '''这是实例化一个threading.Thread类的对象作为一个线程,传入参数‘target=函数的名字’,args为一个参数列表或元组,其中元素为函数所需要的参数,args=(函数参数)'''
20
21 threads.append(t) '''将实例加入threads中'''
22
23 for i in nloops: # start threads
24 threads[i].start() '''循环启动各个对象的stat(),虽然是一个一个启动,但是在执行的时候是并发的同时的'''
25
26 for i in nloops: # wait for all
27 threads[i].join() '''等待线程结束'''
28
29 print 'all DONE at:', ctime() '''打印结束时间'''
30
31 if __name__ == '__main__': '''这一句告诉解释器,执行的时候从main()开始
32 main()