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中,我们主要学习了如何在线程池中调用委托以及如何在线程池中执行异步操作,在这篇中,我们将学习线程池和并行度.实现取消选项的相关知识. 三.线程池和并行度 在这一小节中,我 ...
随机推荐
- 欧姆龙plc通讯协议格式
欧姆龙CPM1A型plc与上位计算机通信的顺序是上位机先发出命令信息给PLC,PLC返回响应信息给上位 机.每次通信发送/接受的一组数据称为一"帧".帧由少于131个字符的数据构成 ...
- Asp.net Core C#进行筛选、过滤、使用PredicateBuilder进行动态拼接lamdba表达式树并用作条件精准查询,模糊查询
在asp.net core.asp.net 中做where条件过滤筛选的时候写的长而繁琐不利于维护,用PredicateBuilder进行筛选.过滤.LInq配合Ef.core进行动态拼接lamdba ...
- 将manjaro作为主力开发系统,我遇到了哪些坑。
首先遇到的问题就是企业微信. 最开始几天,我直接去安装企业微信和微信,安装全都报错了. 无奈之下,只好安装了virtual box,装了一个win7,可以正常使用微信,企业微信,最开始蛋疼的地方是,企 ...
- 你一定不知道的Unsafe用法
Unsafe是什么 首先我们说Unsafe类位于rt.jar里面sun.misc包下面,Unsafe翻译过来是不安全的,这倒不是说这个类是不安全的,而是说开发人员使用Unsafe是不安全的,也就是不推 ...
- QT判断文件/目录是否存在
最近在用qt写一个ui,遇到删除sd卡中的文件失败情况,有些时候是存在删除链表里面的文件在sd卡上已经不存在了,导致失败,以为我的链表是定时刷新的,但是文件是实时更新会同步覆盖的.这样就存在可能上一秒 ...
- 链表中倒数第K个结点 牛客网 程序员面试金典 C++ Python
链表中倒数第K个结点 牛客网 程序员面试金典 C++ Python 题目描述 输入一个链表,输出该链表中倒数第k个结点. C++ /* struct ListNode { int val; struc ...
- Linux下的 sniff-andthen-spoof程序编写
Linux下的 sniff-andthen-spoof程序编写 一.任务描述 在本任务中,您将结合嗅探和欺骗技术来实现以下嗅探然后欺骗程序.你需要两台机器在同一个局域网.从机器A ping IP_X, ...
- OpenHarmony LiteOS C-SKY指令集移植指北
摘要:本文介绍在OpenHarmony社区LiteOS-M项目中新增C-SKY指令集的开发流程,以及适配相应qemu工程的方法和步骤,供LiteOS内核相关开发者学习交流. 本文分享自华为云社区< ...
- React 三大属性state,props,refs以及组件嵌套的应用
React 三大属性state,props,refs以及组件嵌套的应用 该项目实现了一个简单的表单输入添加列表的内容 代码如下 <!DOCTYPE html> <html> & ...
- 浅讲.Net 6 并与之前版本写法对比
介绍 昨天vs2022正式版已经推出了,估计很多人已经下载并开始创建.Net 6 开始尝鲜了, 本节我简要的给大家介绍一下.Net 6的一些改动. 正文 本次.Net6带来最明显的变化就是: 采用顶级 ...