selenium+python之python多线程
程序、进程及线程的区别
计算机程序是磁盘中可执行的二进制数据(或者其他类型)他们只有在被读取到内存中,被操作系统调用才开始他们的生命周期。
进程是程序的一次执行,每个进程都有自己的地址空间,内存,数据栈,以及其他记录其运行轨迹的辅助数据,操作系统管理再其上面运行的所有进程,并为这些进程公平得分配时间。
线程与进程相似,不同的是所有的线程都运行在同一个进程中,共享相同的运行环境。
1.单线程
单线程时,当处理器需要处理多个任务时,必须对这些任务安排执行的顺序,并按照这个顺序来执行任务。
- from time import sleep, ctime
- # 听音乐
- def music():
- print('i was listening to music! %s' % ctime())
- sleep(2)
- # 看电影
- def movie():
- print('i was at the movies! %s' % ctime())
- sleep(5)
- if __name__ == '__main__':
- music()
- movie()
- print('all end:', ctime())
增加循环功能:
- from time import sleep, ctime
- # 听音乐
- def music(func, loop):
- for i in range(loop):
- print('i was listening to music! %s !%s' % (func, ctime()))
- sleep(2)
- # 看电影
- def movie(func, loop):
- for i in range(loop):
- print('i was listening to music! %s !%s' % (func, ctime()))
- sleep(5)
- if __name__ == '__main__':
- music('爱情买卖', 2)
- movie('一代宗师', 2)
- print('all end:', ctime())
给music()和movie()两个函数设置参数:播放文件和播放次数。函数中通过for循环控制播放的次数。
2、多线程
python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的,原始的线程以及一个简单的锁。threading基于Java的线程模型设计。锁(lock)和条件变量(condition)在Java中时对象的基本行为(每个对象都自带了锁和条件变量),而在python中则是独立的对象。
(1)threading模块
避免使用thread模块,原因是它不支持守护线程。当主线程退出时,所有的子线程不关他们是否还在工作,都会被强行退出。但是我们并不希望发生这种行为。就要引入守护线程的概念。threading支持守护线程。
- from time import sleep, ctime
- import threading
- # 听音乐
- def music(func, loop):
- for i in range(loop):
- print('i was listening to music! %s !%s' % (func, ctime()))
- sleep(2)
- # 看电影
- def movie(func, loop):
- for i in range(loop):
- print('i was listening to music! %s !%s' % (func, ctime()))
- sleep(5)
- # 创建线程数组
- threads = []
- # 创建线程t1,并添加到线程数组
- t1 = threading.Thread(target=music, args=('爱情买卖', 2))
- threads.append(t1)
- # 创建线程t2,并添加到线程数组
- t2 = threading.Thread(target=music, args=('一代宗师', 2))
- threads.append(t2)
- if __name__ == '__main__':
- # 启动线程
- for t in threads:
- t.start()
- # 守护线程
- for t in threads:
- t.join()
- print('all end:', ctime())
注:import threading: 引入线程模块
threads = []:创建线程数组,用于装载线程。
threading.Thread(): 通过调用threading模块的Thread()方法来创建线程。
运行结果如下:
从上面运行的结果可以看出,两个子线程(music,movie)同时启动于10分15秒,知道所有线程结束于10分17秒共好使2秒。从执行的结果可以看出两个线程达到了并行工作。
优化线程的创建
从上面例子中发现线程的创建很麻烦,每创建一个线程都需要一个t(t1,t2.。。。。)当创建的线程较多时,这样的操作及其的不方便。
- from time import sleep, ctime
- import threading
- # 创建超级播放器
- def super_player(file_, loop):
- for i in range(2):
- print('start playing: %s !%s' % (file_, ctime()))
- sleep(2)
- # 播放文件与播放时长
- lists = {'爱情买卖.mp3':3,'阿凡达.mp4':5,'传奇.mp3':4}
- threads = []
- files = range(len(lists))
- print(files)
- # 创建线程
- print(lists.items())
- for file_,time in lists.items():
- t = threading.Thread(target=super_player,args=(file_,time))
- print(t)
- threads.append(t)
- if __name__ == '__main__':
- # 启动线程
- for t in files:
- threads[t].start()
- # 守护线程
- for t in files:
- threads[t].join()
- print(' end:%s'% ctime())
- from time import sleep, ctime
- import threading
- # 创建超级播放器
- def super_player(file_, loop):
- for i in range(3): # 控制线程的循环次数
- print('start playing: %s !%s' % (file_, ctime()))
- sleep(3) # 每次循环的间接次数
- # 播放文件与播放时长
- lists = {'爱情买卖.mp3': 3, '阿凡达.mp4': 5, '传奇.mp3': 4}
- threads = []
- files = range(len(lists))
- print(len(lists))
- print(files) # 打印的结果是range(0,3)
- # 创建线程
- print(lists.items())
- for file_, time in lists.items():
- t = threading.Thread(target=super_player, args=(file_, time))
- print(t)
- threads.append(t)
- if __name__ == '__main__':
- # 启动线程
- for t in files:
- threads[t].start()
- # 守护线程
- for t in files:
- threads[t].join()
- print(' end:%s' % ctime())
创建了一个super_player()函数,这个函数可以接收播放文件和播放时长,可以播放任何文件。
创建了一个lists字典用于存放播放文件名与时长,通过for循环读取字典,并调用super_play()函数创建字典,接着将创建的字典都追加到threads数组中。
最后通过循环启动线程数组threads中的线程。
创建线程类(未懂)
- import threading
- from time import sleep, ctime
- # 创建线程类
- class MyThread (threading.Thread):
- def __init__(self, func, args, name=''):
- threading.Thread.__init__ (self)
- self.func = func
- self.args = args
- self.name = name
- def run(self):
- self.func (*self.args)
- # 创建超级播放器
- def super_player(file_, loop):
- for i in range (3): # 控制线程的循环次数
- print ('start playing: %s !%s' % (file_, ctime ()))
- sleep (3) # 每次循环的间接次数
- # 播放文件与播放时长
- lists = {'爱情买卖.mp3': 3, '阿凡达.mp4': 5, '传奇.mp3': 4}
- threads = []
- files = range (len (lists))
- print (len (lists))
- print (files) # 打印的结果是range(0,3)
- # 创建线程
- print (lists.items ())
- for file_, time in lists.items ():
- t = threading.Thread (target=super_player, args=(file_, time))
- print (t)
- threads.append (t)
- if __name__ == '__main__':
- # 启动线程
- for t in files:
- threads[t].start ()
- # 守护线程
- for t in files:
- threads[t].join ()
- print (' end:%s' % ctime ())
MyThread(threading.Thread)
创建MyThread类,用于继承threading.Thread类
__init__()类的初始化方法对func,args,name等参数进行初始化。
- self.func (*self.args)函数的作用是当函数参数已经存在于一个元组或者字典中时,apply()间接地调用函数。args是一个包含将要提供给函数的按位置传递的参数元组。
如果省略了args,则任何参数不会被传递,kwargs是一个包含关键字参数的字典。- 注:以上内容为转载
selenium+python之python多线程的更多相关文章
- python高级之多线程
python高级之多线程 本节内容 线程与进程定义及区别 python全局解释器锁 线程的定义及使用 互斥锁 线程死锁和递归锁 条件变量同步(Condition) 同步条件(Event) 信号量 队列 ...
- python 类变量 在多线程下的共享与释放问题
最近被多线程给坑了下,没意识到类变量在多线程下是共享的,还有一个就是没意识到 内存释放问题,导致越累越大 1.python 类变量 在多线程情况 下的 是共享的 2.python 类变量 在多线程情况 ...
- python中的多线程【转】
转载自: http://c4fun.cn/blog/2014/05/06/python-threading/ python中关于多线程的操作可以使用thread和threading模块来实现,其中th ...
- Python之FTP多线程下载文件之分块多线程文件合并
Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...
- Python之FTP多线程下载文件之多线程分块下载文件
Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...
- Python系列之多线程、多进程
线程是操作系统直接支持的执行单元,因此,高级语言通常都内置多线程的支持,Python也不例外,并且,Python的线程是真正的Posix Thread,而不是模拟出来的线程. Python的标准库提供 ...
- Python 简单理解多线程
进程,是一个或多个线程的集合,每个进程在内存中是相对独立的. 线程,是计算机最小的运算单元,每个进程至少要有一个线程,多个线程时,每个线程间之间共享内存. 分别举例常规运行和多线程运行: 0)常规运行 ...
- python中的多线程
一个程序可以理解为一个进程,这个进程有其代号,可以依据这个代号将其杀死. 一个进程肯定有且只有一个主线程,他可以有很多子线程. 运行一个任务如果可以有许多子线程同时去做,当然会提高效率. 但是,在py ...
- python单线程,多线程和协程速度对比
在某些应用场景下,想要提高python的并发能力,可以使用多线程,或者协程.比如网络爬虫,数据库操作等一些IO密集型的操作.下面对比python单线程,多线程和协程在网络爬虫场景下的速度. 一,单线程 ...
- python大法好——多线程
Python 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件 ...
随机推荐
- DL杂谈
好久不写了,几点这次项目经验吧,本次训练位多任务训练,主要目的训练人脸角度,具体公司项目不细谈. 讲一下主要碰到的坑: 1 最主要问题,网络结构不对称,导致主任务与辅助任务之间的梯度关系不平衡从而导致 ...
- iview组件select之默认展示label,并传空value做方法入参
要求: 默认查询操作日期在当日的数据:(打开页面时默认选中时间.全部) 后台约定:选定“全部”这个条件,传的值是空"" 综上:使用select选择框的v-model绑定数据,使用: ...
- mysql Split函数
mysql没有split函数,这里手动写一个: ),)) BEGIN CREATE TEMPORARY TABLE IF NOT EXISTS temp_split ( col ) ); DELETE ...
- linux 下 .o 文件, .a文件,.so文件的区别
最近在unbuntu环境下开发代码,由于很少使用linux开发环境,所以对linux编译方面了解更少,关于.o, .a, .so文件和可执行文件一直很困惑 今天特意查了一下关于它们的区分: .o 就相 ...
- WP之样式
1.定义资源 <Window.Resources> <!--下面用样式--> <Style x:Key="BigFontButtonStyle"> ...
- SQL Server 截取两个固定字符之间的字符串(案例)
网上的问题: 参考这篇<函数PARSENAME使用和截取字符串>https://www.cnblogs.com/insus/p/10958452.html 的方法: )='||MO21|T ...
- 移动端专用css
通过设置css属性 -webkit-tap-highlight-color: rgba(0, 0, 0, 0);取消掉手机端webkit浏览器 点击按钮或超链接之类的 默认灰色背景色 设置css属性 ...
- unite2017相关
日程 http://unite2017.csdn.net/ http://www.sohu.com/a/137202360_280780 http://www.gameres.com/750046.h ...
- UIPI VS与Win7 共舞:用户界面特权隔离
http://tech.it168.com/a2009/0924/737/000000737968.shtml [IT168 专稿]在上文中,我们介绍了操作系统服务的Session 0隔离,通过Ses ...
- 51nod1107(逆序对数&归并排序)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1107 题意:中文题诶- 思路:通过题意可以发现对于两点p1(x ...