python并发编程——多线程
编程的乐趣在于让程序越来越快,这里将给大家介绍一个种加快程序运行的的编程方式——多线程
1 著名的全局解释锁(GIL)
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- Created on Mon Jun 5 16:12:14 2017
- @author: 80002419
- """
- import threading
- import time
- def cost(fun):##定义一个装饰器,用来计算函数运行的时间
- def wrapper(*args,**kargs):
- before_tm = time.time()
- fun(*args,**kargs);
- after_tm = time.time()
- fun.__doc__
- print("{0} cost:{1}".format(fun.__name__,after_tm-before_tm))
- return wrapper
- def fibs1(n):
- if (n == 1):
- return 0
- elif(n == 2):
- return 1
- else:
- return fibs1(n-2)+fibs1(n-1)
- def fibs2(n):
- list = []
- if (n == 1):
- list = [0]
- return list[-1]
- elif(n == 2):
- list = [0,1]
- return list[-1]
- else:
- list = [0,1]
- for i in range(2,n):
- list.append(list[i-1]+list[i-2])
- return list[-1]
- @cost
- def nothread():
- fibs1(35)
- fibs1(35)
- #@cost
- #def nothread1():
- # print(fibs2(40))
- # print(fibs2(40))
- @cost
- #使用多线程的程序
- def inthread():
- threads = []
- for i in range(2):
- t = threading.Thread(target = fibs1,args =(35,))
- t.start()
- threads.append(t)
- for t in threads:
- t.join()
- @cost
- def inthread1():
- for i in range(2):
- t = threading.Thread(target=fibs1, args=(35,))
- t.start()
- main_thread = threading.currentThread()
- for t in threading.enumerate():
- if t is main_thread:
- continue
- t.join()
- nothread()
- inthread()
打印结果:
inthread cost:14.6728241444
对于cpu密集型任务,使用多线程反而会减慢程序的运行。
GIL是必须的,这是Python设计的问题:Python解释器是非线程安全的。这意味着当从线程内尝试安全的访问Python对象的时候将有一个全局的强制锁。当然python
多线程也有可以加快程序运行的时候:当我们开发和网络通信或者数据输入/输出相关的程序,比如网络爬虫、文本处理等等。这时候由于网络情况和I/O的性能的限制,Python解释器会等待读写数据的函数调用返回,这个时候就可以利用多线程库提高并发效率了。这类任务我们称为IO(密集型任务)
2 Semaphore类 ——python对象访问量的控制
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- Created on Mon Jun 5 16:12:14 2017
- @author: 80002419
- """
- from threading import Thread, Semaphore
- import time,threading
- sema = Semaphore(3) # 定义一个信号量为3的Semaphone对象,
- #定义一个测试函数作为,被访问的对象
- def test(tid):
- with sema:
- print("信号量:{0}".format(tid))
- time.sleep(0.5)
- print('release!')
- thds = []
- for i in range(6):
- t = Thread(target = test,args=(i,))
- t.start()
- thds.append(t)
- for t in thds:
- t.join()
打印结果:
信号量:1
信号量:0
release!
信号量:0
release!
信号量:0
release!
信号量:0
release!
release!
release!
Semaphore类的作用就是限制公共资源的访问量
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- Created on Mon Jun 5 16:12:14 2017
- @author: 80002419
- """
- from threading import Thread, Lock
- import time,threading
- value = 0;
- def changeValue():
- global value
- new = value + 1
- time.sleep(0.001)#让其它进程可以切换进来
- value = new
- thds = []
- for _ in range(100):
- t = Thread(target = changeValue)
- t.start()
- thds.append(t)
- for t in thds:
- t.join()
- print(value)
打印结果:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- Created on Mon Jun 5 16:12:14 2017
- @author: 80002419
- """
- from threading import Thread, Lock
- import time,threading
- value = 0
- lock = Lock()
- def changeValue():
- global value
- with lock:
- new = value + 1
- time.sleep(0.001)#让其它进程可以切换进来
- value = new
- thds = []
- for _ in range(100):
- t = Thread(target = changeValue)
- t.start()
- thds.append(t)
- for t in thds:
- t.join()
- print(value)
打印结果:
想要获取更多Python学习资料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起来学习讨论吧!
python并发编程——多线程的更多相关文章
- python并发编程&多线程(二)
前导理论知识见:python并发编程&多线程(一) 一 threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性 官网链 ...
- python并发编程&多线程(一)
本篇理论居多,实际操作见: python并发编程&多线程(二) 一 什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程,一 ...
- python 并发编程 多线程 目录
线程理论 python 并发编程 多线程 开启线程的两种方式 python 并发编程 多线程与多进程的区别 python 并发编程 多线程 Thread对象的其他属性或方法 python 并发编程 多 ...
- Python并发编程——多线程与协程
Pythpn并发编程--多线程与协程 目录 Pythpn并发编程--多线程与协程 1. 进程与线程 1.1 概念上 1.2 多进程与多线程--同时执行多个任务 2. 并发和并行 3. Python多线 ...
- python并发编程-多线程实现服务端并发-GIL全局解释器锁-验证python多线程是否有用-死锁-递归锁-信号量-Event事件-线程结合队列-03
目录 结合多线程实现服务端并发(不用socketserver模块) 服务端代码 客户端代码 CIL全局解释器锁****** 可能被问到的两个判断 与普通互斥锁的区别 验证python的多线程是否有用需 ...
- python 并发编程 多线程 GIL与多线程
GIL与多线程 有了GIL的存在,同一时刻同一进程中只有一个线程被执行 多进程可以利用多核,但是开销大,而python的多线程开销小,但却无法利用多核优势 1.cpu到底是用来做计算的,还是用来做I/ ...
- python 并发编程 多线程 GIL全局解释器锁基本概念
首先需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念. 就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码. ...
- python 并发编程 多线程 GIL与Lock
GIL与Lock Python已经有一个GIL来保证同一时间只能有一个线程来执行了,为什么这里还需要互斥锁lock? 锁的目的是为了保护共享的数据,同一时间只能有一个线程来修改共享的数据 GIT保证了 ...
- python 并发编程 多线程 线程queue
线程queue 线程之间已经是共享数据的,为什么还使用线程queue? 线程需要自己加锁,线程queue帮我们处理好加锁的问题 有三种不同的用法 第一种方法: class queue.Queue(ma ...
随机推荐
- 免费撸12个月AWS服务器
前言 AWS联合博客园免费发送福利了,活动时间11月1号-11月31号,注册AWS免费体验12个月的服务器哦. 参考教程 官网教程: https://www.cnblogs.com/cmt/p/139 ...
- 体育成绩统计/ Score
偏水向,请部分学术控谅解 题目过长,不再描述. 很显然就是一道大模拟对吧,我在这里贡献一下我打此题的思路与过程. 或许有些奇淫巧技可以供一些没有过掉的神犇借鉴一下. 2020.11.26 中午: 昨天 ...
- spring与分布式事务
转载:https://www.cnblogs.com/qianjun2017/p/8349829.html 转载:https://blog.csdn.net/jaryle/article/detail ...
- 【mq读书笔记】消息消费过程(钩子 失败重试 消费偏移记录)
在https://www.cnblogs.com/lccsblog/p/12249265.html中,PullMessageService负责对消息队列进行消息拉取,从远端服务器拉取消息后将消息存入P ...
- 手撕HashMap
前言: 平时工作的时候,用的最多的就是ArrayList和HashMap了,今天看了遍HashMap的源码,决定自己手写一遍HashMap. 一.创建MyHashMap接口 我们首先创建一 ...
- 第7.11节 案例详解:Python类实例变量
上节老猿介绍了实例变量的访问方法,本节结合一个具体案例详细介绍实例变量访问. 本节定义一个Vehicle类(车),它有三个实例变量self.wheelcount(轮子数).self.power(动力) ...
- PyQt学习随笔:QTableWidget的visualRow、visualColumn、logicalRow、logicalColumn(可见行、逻辑行、可见列、逻辑列)相关概念及方法探究
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概念 关于逻辑行logicalRow.列logicalColumn和可见行visualRow.列 ...
- PyQt(Python+Qt)学习随笔:QTableView的sortingEnabled属性
老猿Python博文目录 老猿Python博客地址 sortingEnabled属性用于控制是企业视图按列排序功能,如果此属性为True,则对tableView视图中的数据启用排序,如果此属性为Fal ...
- 剑指offer二刷——数组专题——数字在升序数组中出现的次数
题目描述 统计一个数字在升序数组中出现的次数. 我的想法 完整的解法我只想到了遍历数组然后依次统计,但这是不聪明的解法,而且没有利用上"升序数组"的这个条件. 题目标签有提醒可以用 ...
- js 转为整数之Number()、parseInt()、parseFloat()区别
一:Number() 如果是Boolean值,true和false值将分别被转换为1和0. 如果是数字值,只是简单的传入和返回. 如果是null值,返回0. 如果是undefined,返回NaN. 如 ...