到现在为止我所写过的 python反例程序基本都是单线程程序,也就是从执行.py开始到结束只有一个流。然而有时候设计程序时会想要针对不同的需求需要拥有多个流程,也就是多线程程序,这样程序看起来就像并发的。
线程
在python中,如果想在主线程以外独立设计线程,可以使用threading模块
首先让我举一个例子来简单说明python中线程的使用。这里引用一个经典的龟兔赛跑游戏,赛程为10步,每一秒乌龟前进一步,兔子可能睡觉,可能前进两步,那照我们以前单线程的程序来写代码如下:
import random
flags = [True, False]
total_step=10
tortoise_step=0
hare_step=0
while tortoise_step<total_step and hare_step<total_step:
total_step+=1
sleeping = flags[int(random.randint()*10)%2]
if sleeping:
print('兔子睡着了')
else:
hare_step+=2
然而这时可能有人要说,为什么每次都是乌龟的步数先增加,而兔子的步数后增加呢,这对兔子是不是太不公平了?这就是单线程的弊端,那下面我们使用threading模块编写两个线程,一个代表乌龟,一个代表兔子,同时也为了简单介绍threading模块的用法。
import threading, random, time
def tortoise(total_step):
step=0
while step<total_step:
step+=1
print('乌龟跑了{}'.format(step))
def hare(total_step):
step=0
flags = [True, False]
while step<total_step:
slepping = flags[int(random.randint()*10)%2]
if slepping:
print('兔子睡着了')
else:
step+=2
print('兔子跑了{}'.format(step))
#注意下面就是多线程的简单使用方法,target指明等会儿start方法调用的函数,args用来指明传递给函数的自变量,传递元组,因此使用(10,)
t = threading.Thread(target=tortoise, args=(10,))
h = threading.Thread(target=hare, args=(10,))
t.start()
h.start()
当然,python中也可以像java一样集成threading.Thread类,并在类中定义run方法来实现线程功能,不过在python中我们不建议这么做,也一般不这么做。
今天的讲解先到这里,我们下一期会讲线程的启动和停止。