并发
当我们执行.py从开始到结束只有一个流程的时候,这种是单线程程序,有时候设计程序时会想要针对不同的需求拥有多个流程,也就是所谓的多线程(Multi-thread)程序,这样的程序在执行的时候看起来像是并发
线程介绍
如果要设计一个龟兔赛跑游戏,赛程长度为10步,每经过1秒,乌龟会前进一部,兔子可能前进两步或睡觉,如果使用单线程可能会如下设计:
import random
flags = [True, False]
total_step = 10
tortoise_step = 0
hare_step = 0
print("龟兔赛跑开始...")
while tortoise_step < total_step and hare_step < total_step:
tortoise_step += 1
print(‘乌龟跑了 {} 步...‘.format(tortoise_step))
sleeping = flags[int(random.random() * 10) % 2]
if sleeping:
print(‘兔子睡着了zzzzz‘)
else:
hare_step += 2
print(‘兔子跑了 {} 步...‘.format(hare_step))
由于程序只有一个流程,因此只能将乌龟与兔子的行为混杂在这个流程中编写。为什么每次都先递增乌龟再递增兔子步数呢?这样对兔子很不公平啊!如果可以编写程序启动两个线程,一个是乌龟线程,一个是兔子线程,程序逻辑就会比较清楚。
在Python中,如果想在主线程以外独立设计线程,可以使用threading模块,例如可以在两个独立的函数中分别设计乌龟与兔子的线程。
import random, threading, time
def tortoise(total_step):
step = 0
while step < total_step:
step += 1
print(‘乌龟跑了 {} 步...‘.format(step))
time.sleep(1) #为了方便直观看到效果
def hare(total_step):
step = 0
flags = [True, False]
while step < total_step:
sleeping = flags[int(random.random() * 10) % 2]
if sleeping:
print(‘兔子睡着了zzzz‘)
time.sleep(1)
else:
step += 2
print(‘兔子跑了 {} 步...‘.format(step))
time.sleep(1)
t = threading.Thread(target=tortoise, args=(10,))
h = threading.Thread(target=hare, args=(10,))
t.start()
h.start()