线程模块

python的多线程只能利用cpu的一个核心,一个核心同时只能运行一个任务那么为什么你使用多线程的时候,它的确是比单线程快
答:如果是一个计算为主的程序(专业一点称为CPU密集型程序),这一点确实是比较吃亏的,每个线程运行一遍,就相当于单线程再跑,甚至比单线程还要慢——CPU切换线程的上下文也是要有开销的。
但是,如果是一个磁盘或网络为主的程序(IO密集型)就不同了。一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,
而单线程的话此时还是在一个一个等待的。我们都知道IO的速度比起CPU来是慢到令人发指的,python的多线程就在这时候发挥作用了。比方说多线程网络传输,多线程往不同的目录写文件,等等。

Python通过两个标准库thread和threading提供对线程的支持。thread提供了低级别的、原始的线程以及一个简单的锁。

threading 模块提供的其他方法:

  • threading.currentThread(): 返回当前的线程变量。
  • threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
  • threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:

  • run(): 用以表示线程活动的方法。
  • start():启动线程活动。
  • join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
  • isAlive(): 返回线程是否活动的。
  • getName(): 返回线程名。
  • setName(): 设置线程名。

定义一个线程:

def learn(name,age):
print('my name is %s ,%s years old ,i like swim '%(name,age))
#定义一个线程,指定运行哪个程序,一个线程后args后边跟逗号
t=threading.Thread(target=learn,args=('wang',34))
t.start()

如果要启动多个线程,可以使用循环实现:

users=[
['wang',34,'swim'],
['li',23,'travel'],
['zhao',14,'reading'] ]
def learn(name,age,skill):
time.sleep(10)
print('my name is %s ,%s years old ,i like %s '%(name,age,skill))
#定义一个线程,指定运行哪个程序,一个线程后args后边跟逗号
for user in users:
t=threading.Thread(target=learn,args=(user[0],user[1],user[2]))
t.start() print('主线程结束')

查看执行结果:

主线程结束
my name is wang ,34 years old ,i like swim
my name is li ,23 years old ,i like travel
my name is zhao ,14 years old ,i like reading

Python中,默认情况下,如果不加join语句,那么主线程不会等到当前线程结束才结束,但却不会立即杀死该线程

我们看到上边的代码,执行后,先结束了主线程,但子线程还在执行中,10秒以后子线程结束,为了避免这种情况,我们可以使用join来是子线程进行等待,join是阻塞当前线程,即使得在当前线程结束时,不会退出。

users=[
['wang',34,'swim'],
['li',23,'travel'],
['zhao',14,'reading'] ]
def learn(name,age,skill):
time.sleep(5)
print('my name is %s ,%s years old ,i like %s '%(name,age,skill))
#定义一个线程,指定运行哪个程序,一个线程后args后边跟逗号
threads=[]
for user in users:
t=threading.Thread(target=learn,args=(user[0],user[1],user[2]))
t.start()
threads.append(t)
for t in threads:
t.join()#主线程等待子线程结束 print('主线程结束')

执行查看结果:

my name is li ,23 years old ,i like travel
my name is zhao ,14 years old ,i like reading
my name is wang ,34 years old ,i like swim
主线程结束

守护线程:setDaemon(True),设置之后如果不加join语句,当主线程结束后,会杀死子线程

users=[
['wang',34,'swim'],
['li',23,'travel'],
['zhao',14,'reading'] ]
def learn(name,age,skill):
time.sleep(5)
print('my name is %s ,%s years old ,i like %s '%(name,age,skill))
#定义一个线程,指定运行哪个程序,一个线程后args后边跟逗号
threads=[]
for user in users:
t=threading.Thread(target=learn,args=(user[0],user[1],user[2]))
t.setDaemon(True)
t.start() print('主线程结束')

执行查看结果:
主线程结束

我们看到,不加setDaemon(True)的时候,主线程结束之后,子线程没有立即结束,是在执行完之后结束的。添加setDaemon(True),主线程结束后子线程立即结束。

线程池:我们上面用到的循环的方式开启了多个线程,python中可以使用第三方的包threadpool线程池包,实现处理线程问题

安装:pip install threadpool

(1)引入threadpool模块

    (2)定义线程函数
    (3)创建线程 池threadpool.ThreadPool()
    (4)创建需要线程池处理的任务即threadpool.makeRequests()
    (5)将创建的多个任务put到线程池中,threadpool.putRequest
    (6)等到所有任务处理完毕theadpool.wait()
import threadpool
#定义线程函数
def say(num):
print(num) #创建线程池
pool=threadpool.ThreadPool(3)
#生成线程池要执行的东西,makeRequests,传入数量,自动找出每个线程要执行的数据
reqs=threadpool.makeRequests(say,list(range(11)))
#创建多个任务put到线程池中
for req in reqs:
pool.putRequest(req)
pool.wait()

执行:

0
1
2
3
4
5
6
7
8
9
10

现在我们可以来封装一个线程池了:

import threadpool

class MyPool(object):
def __init__(self,func,poolsize=10,data=None):
self.func=func
self.poolsize=poolsize
self.data=data
def pool(self):
pool=threadpool.ThreadPool(self.poolsize)
reqs=threadpool.makeRequests(self.func,self.data)
[pool.putRequest(req) for req in reqs]
pool.wait()

我们定义一个简单的函数来调用一下:

def say(num):
print(num) my=MyPool(say,2,[1,2,3,4,5])
my.pool()

python自动化测试学习笔记-8多线程的更多相关文章

  1. Python Web学习笔记之多线程编程

    本次给大家介绍Python的多线程编程,标题如下: Python多线程简介 Python多线程之threading模块 Python多线程之Lock线程锁 Python多线程之Python的GIL锁 ...

  2. python自动化测试学习笔记-10YAML

    之前学习的编写测试用例的方法,都是从excel中编写接口的测试用例,然后通过读取excel文件进行接口自动化测试,这种方式我们叫做数据驱动的方式,由于excel操作起来不灵活,无法实现关联关系的接口测 ...

  3. python自动化测试学习笔记-1

    一.什么是自动化 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程.直白的就是为了节省人力.时间或硬件资源,提高测试效率,便引入了通过软件或程序自动化执行测试用例进行测试: 二.python ...

  4. python自动化测试学习笔记-9测试框架

    学习了这么久的python,我们已经可以自己搭建一个简单的测试和框架了,先从简单的开始,有时我们编写接口的测试用例会用excel进行编写,以下面的接口测试用例模板为例,进行编写:

  5. python自动化测试学习笔记-6urllib模块&request模块

    python3的urllib 模块提供了获取页面的功能. urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capat ...

  6. python自动化测试学习笔记-5常用模块

    上一次学习了os模块,sys模块,json模块,random模块,string模块,time模块,hashlib模块,今天继续学习以下的常用模块: 1.datetime模块 2.pymysql模块(3 ...

  7. python自动化测试学习笔记-4常用模块

    常用模块 1.os 2.sys 3.random 4.string 5.time 6.hashlib 一.os模块 os模块主要用来操作文件.目录,与操作系统无关.要使用os模块首先要导入OS模块,用 ...

  8. python自动化测试学习笔记-4内置函数,处理json

    函数.全局变量 写代码时注意的几点事项: 1.一般写代码的时候尽量少用或不用全局变量,首先全局变量不安全,大家协作的情况下,代码公用容易被篡改,其次全局变量会一直占用系统内容. 2.函数里如果有多个r ...

  9. python自动化测试学习笔记-2-列表

    上次我们学习了python的基本概念,了解了python的变量及数据类型,并实战了条件判断,for/while循环,字符串输出,格式化输出的一些基本用法,接下来我们继续学习其他的一些数据类型. pyt ...

随机推荐

  1. MBP 2018 & Mac keyboard shortcuts

    MBP 2018 & Mac keyboard shortcuts https://support.apple.com/en-us/HT201236 delete key === Contro ...

  2. hdu 4431 绝对值之和最小公式

    /* 普通的二分不好写,反正我没写出来,这题核心需要求出绝对值最小公式 sum=|x+10|+|x+5|+|x+1|+|x-2|+|x-6|;sumx[1]=-10;sumx[2]=-15;sumx[ ...

  3. Vue 实例以及生命周期

    最简单的 Vue 实例 //html <div id="app"> {{message}} </div> //javascript var vm = new ...

  4. 【IntelliJ 】IntelliJ IDEA 自动导入包 快捷方式 关闭重复代码提示

    idea可以自动优化导入包,但是有多个同名的类调用不同的包,必须自己手动Alt+Enter设置 设置idea导入包 勾选标注 1 选项,IntelliJ IDEA 将在我们书写代码的时候自动帮我们优化 ...

  5. Google Protocol Buffer 的使用(一)

    一.什么是Google Protocol Buffer下面是官网给的解释:Protocol buffers are a language-neutral, platform-neutral exten ...

  6. UIButton图片文字位置的四种情况

    我们在做项目的过程中经常会遇到各定制UIButton 1.左边图片,右边文字 2.左边文字,右边图片 3.上边图片,下边文字 4.上边文字,下边图片 针对这四种情况 使用UIButton的catego ...

  7. Servlet处理日期

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/handling-date.html: 使用Servlet的最重要的优势之一是可以使用核心Java ...

  8. Python3.4 12306 2015年3月验证码识别

    import ssl import json from PIL import Image import requests import re import urllib.request as urll ...

  9. UILongPressGestureRecognizer 运行两次的解决的方法

    近期维护之前用iOS SDK 3.2写过的3年多前的map方面的模块,在地图上长按pin,发觉一个点莫名奇异点插了两个pin. 查了一下,原来是如今的sdk要在UILongPressGestureRe ...

  10. MPEG2、MPEG4、H264的差异

    iso(国际标准化组织) MPEG系列 ITU-T(国际电联)h.系列 H.264:iso与ITU联合制定,数据压缩比超牛! MPEG-2简介 MPEG-2制定于1994年,设计目标是高级工业标准的图 ...