python+selenium2学习笔记python中级篇-06多线程

总结一下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因为本人没有装驱动,所有就没有写,可以看到线程是同时启动的

猜你喜欢

转载自blog.csdn.net/u013434475/article/details/81779928