python16线程
python对于I/O密集型应用比较好,具体根据是什么类型应用来查看
对于cpu密集型应用可以借助python的一些扩展去实现
thread模块是比较早期的模块,thresding是比较新的模块,对thread模块进行了新的封装,
import threading def loop():
"""新线程执行的代码"""
loop_now_thread = threading.current_thread()
print("loop现在的线程是{}".format(loop_now_thread))
n = 0
while n <5:
print(n)
n += 1 def use_thread():
"""使用线程来实现"""
#当前正在执行的线程名称
now_thread = threading.current_thread()
print("现在的线程是{}".format(now_thread))
#设置线程
t = threading.Thread(target=loop,name="loop_thread")
t.start()
#挂起线程
t.join() if __name__ == "__main__":
use_thread() 结果:
现在的线程是<_MainThread(MainThread, started 15572)>
loop现在的线程是<Thread(loop_thread, started 3980)>
0
1
2
3
4
用类来实现:
import threading
import time class LoopThrea(threading.Thread):
n = 0
def run(self, n=None):
while self.n < 5:
print(self.n)
now_thread = threading.current_thread()
print("现在的线程是{}".format(now_thread))
time.sleep(1)
self.n += 1 if __name__ == "__main__":
t = LoopThrea(name = "quanzhiqiang_loop")
t.start()
t.join() 结果;
0
现在的线程是<LoopThrea(quanzhiqiang_loop, started 16708)>
1
现在的线程是<LoopThrea(quanzhiqiang_loop, started 16708)>
2
现在的线程是<LoopThrea(quanzhiqiang_loop, started 16708)>
3
现在的线程是<LoopThrea(quanzhiqiang_loop, started 16708)>
4
现在的线程是<LoopThrea(quanzhiqiang_loop, started 16708)>
import threading
import time balance = 0
def change_it(n):
global balance
balance = balance +n
time.sleep(2)
balance = balance -n
print("##################{0}#".format(balance))
time.sleep(1) class ChageBlance(threading.Thread): def __init__(self, num, *args, **kwargs):
super().__init__(*args, **kwargs)
self.num = num def run(self):
for i in range(100000):
change_it(self.num) if __name__ == "__main__":
t1 = ChageBlance(5)
t2 = ChageBlance(8)
t1.start()
t2.start()
t1.join()
t2.join()
print("aaaa{0}".format(balance))
结果:有时候不为零 ##################5###################0# ##################8#
##################0#
##################5###################0# ##################5###################0#
import threading
import time my_lock = threading.Lock()
your_lock = threading.Lock()
balance = 0
def change_it(n):
global balance
try:
# 添加锁
my_lock.acquire()
#my_lock.acquire()如果再加如一个锁,就会出现死锁
balance = balance +n
time.sleep(2)
balance = balance -n
print("##################{0}#".format(balance))
#释放锁
finally:
my_lock.release()
time.sleep(1) class ChageBlance(threading.Thread): def __init__(self, num, *args, **kwargs):
super().__init__(*args, **kwargs)
self.num = num def run(self):
for i in range(100000):
change_it(self.num) if __name__ == "__main__":
t1 = ChageBlance(5)
t2 = ChageBlance(8)
t1.start()
t2.start()
t1.join()
t2.join()
print("aaaa{0}".format(balance)) 结果;
##################0#
##################0#
##################0#
##################0#
##################0#
##################0#
因为都是零,这是每个线程都加了锁,防止被修改
Rlock,在一个线程里面可以多次进行自锁
import threading
import time my_lock = threading.Lock()
your_lock = threading.RLock()
balance = 0
def change_it(n):
global balance
try:
# 添加锁
your_lock.acquire()
your_lock.acquire()
balance = balance +n
time.sleep(2)
balance = balance -n
print("##################{0}#".format(balance))
#释放锁R
finally:
your_lock.release()
your_lock.release()
time.sleep(1) class ChageBlance(threading.Thread): def __init__(self, num, *args, **kwargs):
super().__init__(*args, **kwargs)
self.num = num def run(self):
for i in range(100000):
change_it(self.num) if __name__ == "__main__":
t1 = ChageBlance(5)
t2 = ChageBlance(8)
t1.start()
t2.start()
t1.join()
t2.join()
print("aaaa{0}".format(balance)) 结果: ##################0#
##################0#
##################0#
##################0#
##################0#
利用线程池,减少创建线程和销毁线程所带来的系统性能消耗
另外i一个也是线程池,只不过更加厉害
import time
import threading
from concurrent.futures.thread import ThreadPoolExecutor
from multiprocessing.dummy import Pool def run(n):
time.sleep(2)
print(threading.current_thread().name,n) def main():
t1 = time.time()
for n in range(5):
run(n) print(time.time() - t1) def main_use_thread():
ls = []
t1 = time.time()
for count in range(10):
for i in range(10):
t = threading.Thread(target=run,args=(i,))
ls.append(t)
t.start() for l in ls:
l.join()
print(time.time() - t1) def main_use_pool():
t1 = time.time()
n_list = range(100)
pool = Pool(10)
pool.map(run,n_list)
pool.close()
pool.join()
print(time.time() - t1) def main_use_thread():
t1 = time.time()
n_list = range(100)
with ThreadPoolExecutor(max_workers=10) as executor:
executor.map(run,n_list)
print(time.time() - t1) if __name__ == "__main__":
#main()
#下面的执行都是使用十个线程去处理的,效率比较高
#main_use_thread()
#main_use_pool()这个24秒
main_use_thread()#这个20秒
map函数:
map是python内置函数,会根据提供的函数对指定的序列做映射。 map()函数的格式是: map(function,iterable,...)
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。 把函数依次作用在list中的每一个元素上,得到一个新的list并返回。注意,map不改变原list,而是返回一个新list。 通过map还可以实现类型转换
将元组转换为list: map(int,(1,2,3)) # 结果如下:
[1,2,3]
将字符串转换为list: map(int,'1234') # 结果如下:
[1,2,3,4]
提取字典中的key,并将结果放在一个list中: map(int,{1:2,2:3,3:4}) # 结果如下
[1,2,3]
python16线程的更多相关文章
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- [高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java 线程
线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 记一次tomcat线程创建异常调优:unable to create new native thread
测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...
- Android线程管理之ThreadLocal理解及应用场景
前言: 最近在学习总结Android的动画效果,当学到Android属性动画的时候大致看了下源代码,里面的AnimationHandler存取使用了ThreadLocal,激起了我很大的好奇心以及兴趣 ...
- C#多线程之线程池篇3
在上一篇C#多线程之线程池篇2中,我们主要学习了线程池和并行度以及如何实现取消选项的相关知识.在这一篇中,我们主要学习如何使用等待句柄和超时.使用计时器和使用BackgroundWorker组件的相关 ...
- C#多线程之线程池篇2
在上一篇C#多线程之线程池篇1中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
随机推荐
- [no_code][Beta]项目展示博客
$( "#cnblogs_post_body" ).catalog() 团队项目链接 Beta阶段核心开发点: github 前端 github 后端 github OCR文档-含 ...
- 大闸蟹的项目分析——CSDN APP
大闸蟹的软件案例分析 项目 内容 这个作业属于那个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 学习软件工程的相关知识 这个作业在哪个具体方面帮我实现目标 从多角度分析软件 一 ...
- 零基础入门Linux有什么好的学习方法吗?(超详细)
本节旨在介绍对于初学者如何学习 Linux 的建议,在这里不具体分析Linux的学习节点只分析对于零基础的伙伴的学习方法.那么如果你已经确定对 Linux 产生了兴趣,那么接下来我们介绍一下学习 Li ...
- STM32串口USART的使用方法和程序
通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NR 异步串行数据格式的外部设备之间进行全双工数据交换. USART利用分数波特率发生器提供宽范围的波特率选择,支持同步单向通信和半 ...
- 数组中的逆序对 牛客网 剑指Offer
数组中的逆序对 牛客网 剑指Offer 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对10000000 ...
- 链表中环的入口结点 牛客网 剑指Offer
链表中环的入口结点 牛客网 剑指Offer 题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. # class ListNode: # def __init__(se ...
- hdu 2147 kiki's game(DP(SG)打表找规律)
题意: n*m的棋盘,一枚硬币右上角,每人每次可将硬币移向三个方向之一(一格单位):左边,下边,左下边. 无法移动硬币的人负. 给出n和m,问,先手胜还是后手胜. 数据范围: n, m (0<n ...
- 议题解析与复现--《Java内存攻击技术漫谈》(一)
解析与复现议题 Java内存攻击技术漫谈 https://mp.weixin.qq.com/s/JIjBjULjFnKDjEhzVAtxhw allowAttachSelf绕过 在Java9及以后的版 ...
- 基于Lucene的全文检索实践
由于项目的需要,使用到了全文检索技术,这里将前段时间所做的工作进行一个实践总结,方便以后查阅.在实际的工作中,需要灵活的使用lucene里面的查询技术,以达到满足业务要求与搜索性能提升的目的. 一.全 ...
- 用户登录成功后重新获取新的Session
HttpSession session = request.getSession(); // 用来存储原sessionde的值 ConcurrentHash ...