首先看一个简单的没有线程支持的情况下的顺序执行:
<span style="font-size:18px;">from time import sleep, ctime
def loop0():
    print('start loop 0 at:', ctime())
    sleep(4)
    print('loop 0 done at:', ctime())
def loop1():
    print('start loop 1 at:', ctime())
    sleep(4)
    print('loop 1 done at:', ctime())
def main():
    print('starting at:', ctime())
    loop0()
    loop1()
    print('all DONE at:', ctime())
if __name__ == '__main__':
    main()</span>
在这个程序中,loop0 先执行,loop1后执行,其结果如下所示:
如果想要并行执行,需加入threading模块的支持,模块的对象有如下几个:
模块中的主要函数有:
<span style="font-size:18px;">import threading
from time import sleep, ctime
loops = [ 4, 2 ]
def loop(nloop, nsec):
    print('start loop', nloop, 'at:', ctime())
    sleep(nsec)
    print('loop', nloop, 'done at:', ctime())
def main():
    print('starting at:', ctime())
    threads = []
    nloops = range(len(loops))
    for i in nloops:
        t = threading.Thread(target=loop,
	    args=(i, loops[i]))
        threads.append(t)
    for i in nloops:            # 启动线程
        threads[i].start()
    for i in nloops:            # 等待所有线程结束
        threads[i].join()       
    print('all DONE at:', ctime())
if __name__ == '__main__':
    main()</span>
通过观察执行结果可看到,41-43秒loop0和loop1都在执行,其中loop1从41秒执行到43共2秒,loop0从41到45共4秒。
为了使程序更有面向对象的概念,在下个程序中增加了ThreadFunc类和创建Thread对象时实例化一个可调用的ThreadFunc的类对象,代码如下:
<span style="font-size:18px;">import threading
from time import sleep, ctime
loops = [ 4, 2 ]
class ThreadFunc(object):
    def __init__(self, func, args, name=''):
        self.name = name
        self.func = func
        self.args = args
    def __call__(self):
        self.func(*self.args)
def loop(nloop, nsec):
    print('start loop', nloop, 'at:', ctime())
    sleep(nsec)
    print('loop', nloop, 'done at:', ctime())
def main():
    print('starting at:', ctime())
    threads = []
    nloops = range(len(loops))
    for i in nloops:	# create all threads
        t = threading.Thread(
	    target=ThreadFunc(loop, (i, loops[i]),
	    loop.__name__))
        threads.append(t)
    for i in nloops:	# start all threads
        threads[i].start()
    for i in nloops:	# wait for completion
        threads[i].join()
    print('all DONE at:', ctime())
if __name__ == '__main__':
    main()</span>
下面通过一个计算斐波那契、阶乘、累加和三个函数在单线程和多线程中运行来说明多线程的好处。
我们现在要子类化Thread类,以更加灵活的定制线程对象。
myThread子类模块如下:
<span style="font-size:18px;">import threading
from time import time, ctime
class MyThread(threading.Thread):
    def __init__(self, func, args, name=''):
        threading.Thread.__init__(self)
        self.name = name
        self.func = func
        self.args = args
    def getResult(self):
        return self.res
    def run(self):
        print('starting', self.name, 'at:',
              ctime())
        self.res =  self.func(*self.args)
        print(self.name, 'finished at:',
              ctime())</span><span style="font-size:18px;">from myThread import MyThread
from time import ctime, sleep
def fib(x):
    sleep(0.005)
    if x < 2: return 1
    return (fib(x-2) + fib(x-1))
def fac(x):
    sleep(0.1)
    if x < 2: return 1
    return (x * fac(x-1))
def sum(x):
    sleep(0.1)
    if x < 2: return 1
    return (x + sum(x-1))
funcs = (fib, fac, sum)
n = 12
def main():
    nfuncs = range(len(funcs))
    print('*** SINGLE THREAD')
    for i in nfuncs:
        print('starting', funcs[i].__name__,
              'at:', ctime())
        print(funcs[i](n))
        print(funcs[i].__name__, 'finished at:',
              ctime())
    print('\n*** MULTIPLE THREADS')
    threads = []
    for i in nfuncs:
        t = MyThread(funcs[i], (n,),
	    funcs[i].__name__)
        threads.append(t)
    for i in nfuncs:
        threads[i].start()
    for i in nfuncs:
        threads[i].join()
        print(threads[i].getResult())
    print('all DONE')
if __name__ == '__main__':
    main()</span>
参考资料:《Python核心编程》
实例代码下载:https://github.com/wlseu/pythread
原文地址:http://blog.csdn.net/hongkangwl/article/details/41599425