并发
当我们执行.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()