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 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件 ...
随机推荐
- css如何改变placeholder的默认颜色值
input:-moz-placeholder {/* Mozilla Firefox 4 to 18*/ color: red; input::-moz-placeholder {/* Mozilla ...
- [转]对 td 使用 overflow:hidden; 无效的几点错误认识
转载:http://www.cftea.com/c/2010/12/UVBUCD0J888L2XPQ.asp 一.是 td 的原因. 其实这关 td 什么事呢?div 也是一样的,看示例: <d ...
- 如何選擇最佳的 Wi-Fi 無線網路頻道,獲得最佳的傳輸速度(转载)
转自:https://blog.gtwang.org/useful-tools/how-to-find-the-best-wi-fi-channel-for-your-router/
- 防止APP退到被安卓系统清理
一个是尽量提高APP权限,无非就是保持APP始终界面在前台 二是使用守护进程方法,被清理了立刻自己启动, 三是前台跟后台进程分开,被重启了恢复原始环境. // 申请设备电源锁,在服务start的时候. ...
- (转)深度学习(Deep Learning, DL)的相关资料总结
from:http://blog.sciencenet.cn/blog-830496-679604.html 深度学习(Deep Learning,DL)的相关资料总结 有人认为DL是人工智能的一场革 ...
- xrange与range之间的区别
对于这两个好像功能都差不多,这两个经常会被搞混,所以今天一定要把这个完全弄清楚. 首先我们看看range: range([start,] stop[, step]),根据start与stop指定的范围 ...
- [UE4]用C++如何创建Box Collision
http://www.dawnarc.com/2016/08/ue4%E7%94%A8c--%E5%A6%82%E4%BD%95%E5%88%9B%E5%BB%BAbox-collision/ 在蓝图 ...
- [Swift]Xcode实际操作
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- SpringBoot2.0 基础案例(08):集成Redis数据库,实现缓存管理
一.Redis简介 Spring Boot中除了对常用的关系型数据库提供了优秀的自动化支持之外,对于很多NoSQL数据库一样提供了自动化配置的支持,包括:Redis, MongoDB, Elastic ...
- Unity---协程的简单使用
1.作用 协程的作用一共有两点: 延时执行代码. 在某项操作完后再执行代码. 就是控制代码在特性的时间执行. 2.协程和线程的区别 协程不是异步,不需要考虑同步和锁问题 线程避免了无意义的调度,提高了 ...