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 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件 ...
随机推荐
- tcp/ip协议和http协议
TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说 TCP/IP 被认为是一个四层协议:应用层(telnet, ftp, http, smtp, dns等),传输层(tcp, ...
- 《深入分析Java Web技术内幕》读后感(Session、cookie)
第10章 P263 理解Cookie 理解Session Session如何工作的
- java中多个线程访问共享数据的方式有哪些
多个线程对共同数据的访问的实现,要根据情况而定 (1)当访问共同的代码的时候:可以使用同一个Runnable对象,这个Runnable对象中有这个共享数据,比如卖票系统就可以这么做.或者这个共享数据封 ...
- HDU - 5492 Find a path(方差公式+dp)
Find a path Frog fell into a maze. This maze is a rectangle containing NN rows and MM columns. Each ...
- 【转】oracle的分析函数over
源地址:http://www.cnblogs.com/sumsen/archive/2012/05/30/2525800.html
- 51nod1154(dp)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1154 题意:中文题目诶- 思路:字符串长度不大于5e3,O(n ...
- 2014-9-27 NOIP模拟赛
1.栅栏迷宫 田野上搭建了一个黄金大神专用的栅栏围成的迷宫.幸运的是,在迷宫的边界上留出了两段栅栏作为迷宫的出口.更幸运的是,所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫 ...
- Vue实现选项卡效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- DOM事件-冒泡、捕获、传播、委托
事件捕获 以点击事件为例事,同类型事件会由根元素开始触发,向内传播,一直到目标元素.从外到内依次触发:根—目标的祖先素—目标的父元素—目标元素. 事件冒泡 根事件捕获截然相反.发生点击事件时,事件会从 ...
- ASPNET Core 2.x中的Kestrel服务器
原文链接 Kestrel是一个基于libuv的跨平台ASP.NET Core web服务器,libuv是一个跨平台的异步I/O库.ASP.NET Core模板项目使用Kestrel作为默认的web服务 ...