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 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件 ...
随机推荐
- 23.Consent 代码重构
新建Services文件,并新建类ConsentService类把,ConsetController里面不是Action的方法都放在这个ConsentService类里面 先把构造函数完善 把这些私有 ...
- Spring入门第十七课
AOP编程 问题: 代码混乱: 越来越多的非业务需求(日志和验证等)加入后,原有的业务方法急剧膨胀,每个方法在处理核心逻辑的同事还必须兼顾其他多个关注点. 代码分散:以日志需求为例,只是为了满足这个单 ...
- setInterval(callbackfunc,time)中callbackfunc传参数问题
var si=setInterval(callbackfunc,time)中callbackfunc传参数问题(循环执行) var st=setTimeout(callbackfunc,time);定 ...
- 2. DVWA亲测文件包含漏洞
Low级: 我们分别点击这几个file.php文件 仅仅是配置参数的变化: http://127.0.0.1/DVWA/vulnerabilities/fi/?page=file3.php 如 ...
- WSAStartup()函数的使用
int WSAStartup( __in WORD wVersionRequested, __out LPWSADATA lpWSAData ); WSAStartup 格 式: int PASCA ...
- 杭电1002_A + B Problem II
这是该题的链接http://acm.hdu.edu.cn/showproblem.php?pid=1002 具体的题的内容就不过多描述了,想必你已经知道了,当我看完这道题后就知道咋写了,可是这道题从开 ...
- windows和Dos常见命令总结
linux最常见命令 (1) pwd命令pwd (即print working directory,打印工作路径) 命令的功能是显示当前的工作路径.如现在是在“/home/CAI”目录下,则可以用此命 ...
- IDEA热部署自动重启服务问题
新接手项目过于庞大,从eclipse果断换成了IDEA.因为IDEA有免费的热部署,咳咳咳... 但是,手贱的我在下面这张状态下,直接OK了,TM,这不是我要的热部署啊,这是重新启动啊,但是勾选了do ...
- Java基础笔记(一)——JDK、JRE、JVM
JDK.JRE和JVM三者的关系 Java程序执行过程 JVM(java virtual machine) 注:由于各种操作系统(windows.linux等)支持的指令集(二进制可执行代码)不同,程 ...
- XmlSerilizer序列化出错时,不妨考虑BinaryFormatter
当你使用XmlSerilizer序列化一个结构复杂的类型时出现反射出错 XmlSerilizer并不会告诉你哪个字段属性或者嵌套的字段属性不能被序列号,面对多年前的代码逐一排查很恼人使用BinaryF ...