总结一下threading的用法
Thread是线程类,有两种使用方法,直接传入要运行的方法或从Thread继承并覆盖run()
第一种,看一个简单的例子
import threading,time
def music(file,times):
for i in range(times):
print('listening %s---%s'%(file,time.ctime()))
time.sleep(2)
def movie(file ,times):
for i in range(times):
print('watching %s---%s'%(file,time.ctime()))
time.sleep(3)
#创建线程数组,用于装载线程
threads =[]
#创建线程a1,并添加到线程数组
#music 线程函数 args传递给线程函数的参数,必须是个tuple类型。
a1 = threading.Thread(target=music,args=('月亮之上',2))
threads.append(a1)
#创建线程a2
a2 = threading.Thread(target=movie,args=('小猪佩奇',3))
threads.append(a2)
if __name__ == '__main__':
#启动线程
for i in threads:
i.start()
#守护线程
#如果不用join对每个线程做等待终止,那么在线程运行的过程中可能会直接执行最后的end
for i in threads:
i.join()
print('threads end in %s'%time.ctime())
运行的结果可以看到 听歌和看电影是一起启动的
然后把上面的例子优化一下
import threading,time
def surper_player(file,times):
for i in range(times):#相当于播放次数
print('start playing:%s---%s'%(file,time.ctime()))
time.sleep(times)#相当于播放时长
#播放文件和播放时长
lists = {'音乐1':2,'电影1':3,"音乐2":4}
thread = []
files = range(len(lists))
#创建线程
for file,times in lists.items():
t = threading.Thread(target=surper_player,args=(file,times))
thread.append(t)
if __name__ == '__main__':
for i in files:
thread[i].start()
for i in files:
thread[i].join()
print('all end---%s'%time.ctime())
可以看到音乐1 音乐2 和电影1同时启动,并行工作
lists字典用于存放播放文件和时长,通过for循环去读取字典,调用super_player函数创建字典
接着把创建的字典都扔到thread中,然后循环启动线程数组thread。
第二种方法创建一个线程类
import threading,time
#继承thread.Thread类
class MyThread(threading.Thread):
#初始化方法 对func,args,name参数进行初始化
def __init__(self,func,args,name=''):
threading.Thread.__init__(self)
self.func = func
self.args = args
self.name = name
#重写run方法
def run(self):
self.func(*self.args)
def surper_player(file,times):
for i in range(times):
print('start playing:%s---%s'%(file,time.ctime()))
time.sleep(times)
#播放文件和播放时长
lists = {'音乐1':2,'电影1':3,"音乐2":4}
thread = []
files = range(len(lists))
#创建线程
for file,times in lists.items():
t = MyThread(surper_player,(file,times),surper_player.__name__)
thread.append(t)
if __name__ == '__main__':
for i in files:
thread[i].start()
for i in files:
thread[i].join()
print('all end---%s'%time.ctime())
创建MyThread类,继承thread.Thread类
__init__()类的初始化方法对func,args,name等参数进行初始化
线程的创建启动与前面的例子相同,区别在于使用的是MyThread类
最后看一个百度搜索的实例
import threading,time
from selenium import webdriver
def test_baidu(browser,search):
print('start---%s'%time.ctime())
print('browser is %s'%browser)
if browser == 'Ie':
driver = webdriver.Ie()
elif browser == 'Chrome':
driver = webdriver.Chrome()
elif browser == 'FireFox':
driver = webdriver.Firefox()
else:
print('浏览器只能为Ie、Chrome或FireFox')
driver.get('https://www.baidu.com')
driver.find_element_by_id('kw').send_keys(search)
driver.find_element_by_id('su').click()
time.sleep(2)
driver.quit()
if __name__ == '__main__':
#启动参数,指定浏览器和收搜内容
lists = {'Chrome':'多线程','FireFox':'多线程详解'}
thread =[]
files = range(len(lists))
#创建线程
for browser,search in lists.items():
t = threading.Thread(target=test_baidu,args=(browser,search))
thread.append(t)
#启动线程
for i in files:
thread[i].start()
for i in files:
thread[i].join()
print('all end---%s'%time.ctime())
ie因为本人没有装驱动,所有就没有写,可以看到线程是同时启动的