python多线程

python线程障碍对象Barrier(34)

笑着哭i 提交于 2019-12-06 06:26:37
python线程Barrier俗称障碍对象,也称栅栏,也叫屏障。 一.线程障碍对象Barrier简介 # 导入线程模块 import threading # 障碍对象barrier barrier = threading.Barrier(parties, action=None, timeout=None) parties — 线程计数器,记录线程数量,也称线程障碍数量; action — 是一个可调用函数,当等待的线程到达了线程障碍数量parties,其中一个线程会首先调用action 对应函数,之后再执行线程自己内部的代码; timeout — 默认的超时时间; 二.线程障碍对象Barrier原理 与之前介绍 互斥锁Lock/事件Event/定时器Timer等不同,多线程Barrier会设置一个线程障碍数量parties,如果等待的线程数量没有达到障碍数量parties,所有线程会处于阻塞状态,当等待的线程到达了这个数量就会唤醒所有的等待线程。 可能说的有点抽象,以播放器为例子:首先一个线程做播放器初始化工作(加载本地文件或者获取播放地址),然后一个线程获取视频画面,一个线程获取视频声音,只有当初始化工作完毕,视频画面获取完毕,视频声音获取完毕,播放器才会开始播放,其中任意一个线程没有完成,播放器会处于阻塞状态直到三个任务都完成! 三.多线程障碍对象Barrier相关函数介绍

线程与进程的区别

浪尽此生 提交于 2019-12-06 05:46:11
在python里,如果任务是IO密集型,可以用多线程 如果是计算密集型,用C 主进程里可以创建子进程,子进程的创建相当于copy了主进程,消耗大,占用相同的内存空间,主进程影响子进程 主线程呢不能影响子线程,子线程的内部可以传递信息,共享数据。然而子进程之间不可以传递信息,共享数据 线程利用进程的地址空间 线程之间可以互相操作,进程之间不能互相操作 来源: https://www.cnblogs.com/startl/p/11964585.html

python_多进程

為{幸葍}努か 提交于 2019-12-06 05:36:46
一、多进程 1、多线程,多进程 多线程: 适用于io密集型任务 多进程 适用于cpu密集型任务 1 import multiprocessing,time,virtualenv 2 def down_load(): 3 time.sleep(5) 4 print('运行完了') 5 6 if __name__ == '__main__': 7 for i in range(5): 8 p = multiprocessing.Process(target=down_load) 9 p.start() 10 while len(multiprocessing.active_children()) !=0: #等待子进程结束 11 pass 12 13 print(multiprocessing.current_process()) 14 print('end') 来源: https://www.cnblogs.com/xumb/p/11964268.html

python_多线程

£可爱£侵袭症+ 提交于 2019-12-06 05:32:23
一、多线程 1、多进程是多个资源的集合 2、线程是在进程里面干活 3、线程和线程之间是互相独立的 #实例 def down_load(): time.sleep(5) print('运行完了') def movie(): time.sleep(1) print('movie') start_time = time.time() #方法1: thread_list = [] for i in range(5): t = threading.Thread(target=movie)#启动线程 t.start() #开始线程 thread_list.append(t) for thread in thread_list: thread.join() #主线程等待子线程结束 #方法2: for i in range(5): t = threading.Thread(target=movie)#启动线程 t.start() #开始线程 while threading.activeCount() !=1: pass print(threading.activeCount()) #查看当前线程数 print(threading.current_thread()) #查看当前线程 end_time = time.time() print(end_time - start_time) 来源:

Python 进程和线程

安稳与你 提交于 2019-12-06 02:54:34
前言 1. 什么是“多任务”的操作系统? 简单地说,就是操作系统可以同时运行多个任务。 2. 单核CPU是如何执行多任务的? 操作系统轮流让多个任务交替执行,任务1执行0.01s,切换到任务2,任务2执行0.01s,再切换到任务3,执行0.01s……这样反复执行下去。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样。真正的并行执行多任务只能在多核CPU上实现,但是,由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。 3. 如何通俗的解释进程和线程? 对于操作系统来说,一个任务就是一个“ 进程(Process) ”,例如打开一个浏览器就是启动了浏览器进程,打开了Word就启动了一个Word进程。但是启动Word可能不止同时干一件事,例如:可以同时进行打字、排版、检查等,在一个进程内部,要同时干多件事,就需要同时执行多个“子任务”,我们把进程内的这些“子任务”就称为“ 线程(Thread) ”。由于每个进程至少要干一件事,所以,一个进程至少有一个线程。真正地同时执行多线程需要多核CPU才可能实现。 4. 实现“多任务”的方式有哪些? 多进程模式:启动多个进程,每个进程虽然只有一个线程,但多个进程可以一块执行多个任务。 多线程模式:启动一个进程,在一个进程内启动多个线程,这样

程序性能优化之启动速度与执行效率优化(一)下篇

早过忘川 提交于 2019-12-06 02:45:09
阿里P7移动互联网架构师进阶视频(每日更新中)免费学习请点击: https://space.bilibili.com/474380680 本篇文章将继续以下两个内容来介绍启动速度与执行效率优化: [StrictMode 详解] [Systrace和TraceView] 一 StrictMode 详解 1.1 如何启用 StrictMode 我们通常在 Activity 或者自定义的Application类中启动 StrictMode,代码如下: public void onCreate() { if (DEVELOPER_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog()

python3通过gevent.pool限制协程并发数量

﹥>﹥吖頭↗ 提交于 2019-12-06 02:32:23
协程--gevent模块(单线程高并发) 先恶补一下知识点,上节回顾 上下文切换:当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指针等,最后才开始执行。这种切换称为“上下文切换”(“context switch”)       CPU会在一个上下文中执行一个线程,然后切换到另外一个上下文中执行另外一个线程,上下文切换并不廉价。如果没有必要,应该减少上下文切换的发生 进程: 一个程序需要运行所需的资源的集合每个进程数据是独立的每个进程里至少有一个线程每个进程里有可以多有个线程线程数据是共享的进程间共享数据的代价是高昂的,所以要尽量避免进程间的数据共享线程间的数据本来就是共享的线程要修改同一份数据,必须加锁,互斥锁mutex生产者消费者:1.解耦2.提高程序的运行效率,把中间等待的时间省去多线程场景: IO密集型,因为IO操作基本不占用CPU,所以多用在web,爬虫,socket交互多进程场景:CPU密集型,大数据分析,金融分析,这样用的IO就很少,因为这个进程会进行大量的运算, 但是如果切换了进程,就会变慢 协程 协程:微线程, 协程是一种用户态的轻量级线程,CPU不知道它的存在, 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候

面试官:CPU百分百!给你一分钟,怎么排查?有几种方法?

浪尽此生 提交于 2019-12-06 02:21:52
Part0 遇到了故障怎么办? 在生产上,我们会遇到各种各样的故障,遇到了故障怎么办? 不要慌,只有冷静才是解决故障的利器。 下面以一个例子为例,在生产中碰到了CPU 100%的问题怎么办? 在生产中真的碰到了CPU 100%的问题,再来看这篇文章已经迟了,还是先来模拟演练下吧。 怎么模拟演练? (1)查找资料,选型排查CPU高负载问题的工具。 (2)安装一个高负载程序或手写个高负载应用部署。 (3)安装、执行分析工具,实战分析,找出故障原因。 (4)思考与总结。 Part1 工具选型 因为现在大部分的企业应用都是java编写的,所以我们本次排查的高负载应用也是针对java的,但是思路其实是相同的,如果也有php、python、go等语言写的程序,无非就是换个工具而已,排查的步骤都是类似的。 而top这个命令一定是Linux上不可动摇的资源监控工具。 以下三类工具从原生的top、jstack到功能强大的Arthas和一键式查找的show-busy-java-threads,它们都各有长处。在合适的环境选择合适的工具才是考验一个IT人员能力的时候。 运用之道,存乎一心。 1.1 原生方法 此方法无需额外安装工具,在没法连接互联网的情况下使用此方法排查效果较好。 top、printf都是Linux原生命令,jstack、jstat是jdk自带命令工具。

Python面试题(2)

落爺英雄遲暮 提交于 2019-12-06 00:35:51
1.一行代码实现1-100的和 ? 1 2 3 print ( sum ( range ( 1 , 101 ))) #range中的参数是1<=i<101 #sum是计算参数的和    2.在函数内部改变全局变量 ? 1 2 3 4 5 6 a = 5 def foo1(): global a a = 4 foo1() print (a)    3.列出5个python标准库 time,获取时间戳,时间等。 os获取系统信息,如目录,pid。 subprocess,与linux shell交互 re,正则表达式,如match,findall,search sys,获取程序的参数,路径,退出消息等 psutil,获取系统运行状态,如cpu,mem,disk,net。 4.如何删除字典中的元素,如何更新元素的值,如何合并两个字典 ? 1 2 3 4 5 6 dictA = { 'age' : 18 , 'name' : 'jab' } del dictA[ 'age' ] #删除一个键值对 dictA[ 'name' ] = 'eric' #改变一个key的value tel = { 'tel' : '131111111' } dictA.update(tel) #将tel字典合并到dictA字典 print (dictA)    5 如何删除列表中的元素,如何将删除的元素赋值给变量

python IO密集型为什么使用多线程

时光怂恿深爱的人放手 提交于 2019-12-05 23:55:54
IO密集型为什么使用多线程 python多线程,可以粗浅理解只用了cpu的一个核心。 为什么IO密集型用多线程?假设我们有多个线程都在发网络请求(request, 等response),一个请求的从发出到接收的过程中cpu大多时间都是在等。 所以,当前线程发出请求后,由于不占用cpu资源,可以阻塞等待,然后cpu执行权可以被另外一个线程所享有去发网络请求。 IO密集型,单个CPU利用率很低,可能只有10%,所以多线程可以提升cpu利用率,可能10个线程才能打满一个核心, 从而多线程也有并行的效果。 所以python多线程 计算密集型没救了么 Python社区也在非常努力的不断改进GIL,甚至是尝试去除GIL。并在各个小版本中有了不少的进步。有兴趣的读者可以扩展阅读这个 Slide 另一个改进 Reworking the GIL 将切换颗粒度从基于opcode计数改成基于时间片计数 避免最近一次释放GIL锁的线程再次被立即调度 新增线程优先级功能(高优先级线程可以迫使其他线程释放所持有的GIL锁) 来源: https://www.cnblogs.com/Draymonder/p/11951443.html