在python3中,多线程主要使用threading模块
首先,来看一个单任务模式的例子
import datetime,time def eat_hotpot(food): for i in range(2): print(datetime.datetime.now().strftime('%X') + ' ' + "eat " + str(food)) time.sleep(2) #每一次调用耗时2s def watch_TV(movie): for i in range(2): print(datetime.datetime.now().strftime('%X') + ' ' + "watch " + str(movie)) time.sleep(2) #每一次调用耗时2s if __name__ == '__main__': eat_hotpot("毛肚") watch_TV("末代皇帝") print(datetime.datetime.now().strftime('%X') + ' ' + "吃火锅,看电视都结束啦~~")
14:45:35 eat 毛肚 14:45:37 eat 毛肚 14:45:39 watch 末代皇帝 14:45:41 watch 末代皇帝 14:45:43 吃火锅,看电视都结束啦~~
#时间都相隔2s,运行完程序,耗时8s
运行的结果如上,可以看出,每调用一次耗时2s,整个程序是线性执行的。
接下来我们将程序改造一下:
import threading import datetime,time def eat_hotpot(food): for i in range(2): print(datetime.datetime.now().strftime('%X') + ' ' + "eat " + str(food)) time.sleep(2) def watch_TV(movie): for i in range(2): print(datetime.datetime.now().strftime('%X') + ' ' + "watch " + str(movie)) time.sleep(2) if __name__ == '__main__':
#创建两个子线程 t1 = threading.Thread(target=eat_hotpot,args=('毛肚',)) t2 = threading.Thread(target=watch_TV,args=('末代皇帝',))
#启动两个线程 t1.start() t2.start()
#主线程 print(datetime.datetime.now().strftime('%X') + ' ' + "吃火锅,看电视都结束啦~~")
14:49:43 eat 毛肚 14:49:43 watch 末代皇帝 14:49:43 吃火锅,看电视都结束啦~~ #可以看到eat_hotpot,watch_TV,和主线程都在14:49:43这一时刻同时启动 14:49:45 watch 末代皇帝 #主线程结束后,子线程继续执行 14:49:45 eat 毛肚 #运行完程序,耗时2s
使用threading模块创建多线程,最主要是使用Thread这个类,创建Thread对象后,让他运行,给个Thread代表一个线程,在每个线程中让程序处理不同的任务,这就是多线程编程
threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
target:线程调用的对象,就是函数名,注意不用写括号
name:线程的名字,默认值为“Thread-N“,N是一个数字。
args:为目标函数传递的参数,元组,如果只有一个参数,需要有逗号
kwargs:为目标函数传递的关键字参数,字典
另外该模块还有如下的一些方法和属性
current_thread() #当前线程 Thread.getName() #获取线程name Thread.setName() #设置线程name Thread.ident #获取线程标识符 Thread.is_alive() Thread.isAlive() #判断线程是否激活