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 多线程 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件 ...
随机推荐
- Linux 切换字符界面和图形界面
1. 切换方式 # root 权限 systemctl get-default # 获取当前模式 systemctl set-default graphical.target # 设置开机为图形界面 ...
- [poj3140]Contestants Division树形dp
题意:切掉树上的某条边,使分开的两棵树上各点的权值和差值最小. 与hdu2196不同的是,此题是点权,其他无太大差别,注意数据范围. 先求出每个节点的子树权值和,然后自底向上dp即可.取$\min ( ...
- UIButton和UINavigationItem设置图片和文字位置
1.UIButton设置文字位置 有些时候我们想让UIButton的title居左对齐,我们设置 btn.textLabel.textAlignment = UITextAlignmentLeft 是 ...
- Redis在windows实现将数据缓存起来定时更新读取
实现接口的读取存放在内存中,实现了Web网站直接读取内存数据,大大的减少了访问接口带来的等待时间,这个功能是比较实用的 需要下载一下‘类库’及‘Redis-x64-3.2.100程序包’ 百度云材料下 ...
- react中循环节点的方式以及图片引用的方式
import React from 'react' import img from '../public/img/001.jpg' // 此时img是一个变量,在下面直接使用该变量即可引入该图片 cl ...
- 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (二)
本文属于图神经网络的系列文章,文章目录如下: 从图(Graph)到图卷积(Graph Convolution):漫谈图神经网络模型 (一) 从图(Graph)到图卷积(Graph Convolutio ...
- 在Centos中安装HustOJ实验记录
hustoj是目前使用最广泛的刷题平台,自建平台是编程教学中重要一环,教,学,测,反思形成闭合回路.目前利用现有的服务器资源,建成了开高开源code中心,一个刷题系统,六月再建一个私有云,私有云不仅是 ...
- React中的代码分割
代码分割想要解决的问题是:经打包工具
- CentOS6.7 i686上安装JDK7
内核版本: [root@heima01 java]# uname -a Linux heima01 2.6.32-573.el6.i686 #1 SMP Thu Jul 23 12:37:35 UTC ...
- Python-11-循环
x = 1 while x <= 100: print(x) x += 1 基本上, 可迭代对象是可使用for循环进行遍历的对象. numbers = [0, 1, 2, 3 ...