线程

查看进程线程

陌路散爱 提交于 2020-03-04 14:27:40
1.获取pid ps -ef|grep syslog|grep -v "grep"|awk '{print $2}' 先看ps -ef|grep syslog的输出:(我没有打马赛克,千万不要攻击我的电脑啊) grep的输出都会有grep自身这个进程在,用grep -v "grep"可以把这一行干掉,然后awk '{print $2}'就是打印第二列数字,我这里是在docker容器里, 进程少, 就全都输出了 2.利用进程号查看该进程下的线程 ps -eLf|grep 1|grep -v "grep" ,输出如下: 第四列就是线程号 ps -T -p 1,输出如下:(SPID即线程号) 3.利用top -H -p 1查看线程cpu利用率 第二行(Threads):总共16个线程,0个正在执行,16个睡眠,0个stopped, 0个zombie(僵尸),%CPU和%MEM即cpu占有率和内存占有率,其他字段含义参考top命令 4.pstree -p 1(树状图显示) 来源: https://www.cnblogs.com/lihan829/p/11486786.html

多线程爬取与存储基础

痞子三分冷 提交于 2020-03-04 10:37:22
多线程: 一般的python程序都是前台运行(主线程),即代表了顺序运行只有前面一个运行完毕后才能运行后面一个,但这样有时候会很浪费时间,比如下载两个数据第一个数据单独下载耗时t1而第二个单独下载耗时t2,时间是t1+t2,但是你将这个两个程序放入后台同时运行则时间时max(t1,t2),这似乎没什么但是数据一多优势就体现出来了 首先导入threading库 import threading xxx.threading.Thread(target=yyy,args=) 创造一个以yyy函数为后台运行的名字叫xxx的线程,args是yyy函数的传入参数 xxx.start()启动这个名字叫xxx的线程 xxx.join()堵塞这个线程:等这个线程执行完毕在进行下一个语句 一些存储与读取: 先介绍os库的两个函数 os.path.exsist(path) : 判断path路径是否存在返回bool值 xxx=os.getcwd() : 获得当前工作目录的绝对地址 写入文本(字符串)代码|脚本    import threading import os def write_file(path,data): ''' :param path: 要写入文件的路径 :param data:要写入文件的数据 :return: ''' f = open(path, 'wb') f.write(data

多线程编程学习十二(原子性、可见性与有序性)

半城伤御伤魂 提交于 2020-03-04 10:19:11
原子性 原子(atom)指化学反应不可再分的基本微粒,原子在化学反应中不可分割。原子操作指的是不可分割的整体,多线程的 原子性 指的是没有其他线程能够中断或检查正在原子操作中的变量。 从内存模型来看,直接保证的原子性变量操作包括 read、load、assign、use、store 和 write,我们大致可以认为基本数据类型的访问读写是具备原子性的。 从应用场景来看,JVM 保证原子性操作的主要有以下方式: synchronized 关键字。锁操作,基于 monitorenter 和 monitorexit 字节码指令,保证同步块只有单一线程执行。 AQS 锁机制。比如 ReentrantLock、ReentrantReadWriteLock 等,保证同步块只有单一线程执行。 CAS 实现。比如 java.util.concurrent.atomic 包中的诸多实现。 volatile 关键字。修饰变量,轻量锁机制,仅能保证对单个变量的操作具有原子性,复合操作不具备原子性。 可见性 可见性 是指当一个线程修改了共享变量的值,其他线程能够立即得知这个修改。 从应用场景来看,JVM 保证可见性主要有以下方式: volatile 关键字,它是如何保证可见性的呢? 当对 volatile 变量写的时候,会将当前处理器缓存行的数据写回到系统内存。 当对 volatile 变量读的时候

python3 进程和线程(一)

你说的曾经没有我的故事 提交于 2020-03-04 10:05:10
进程和线程 进程:内存独立,线程共享同一进程的内存,一个进程就像一个应用程序,例如qq和word,这属于两个进程, 进程是资源的集合,线程是执行单位 进程之间不能直接互相访问,同一进程中的程可以互相通信 创建新进程消耗系统资源,线程非常轻量,只保存线程运行时的必要数据,如上下文、程序堆栈信息 同一进程里的线程可以相互控制,父进程可以控制子进程 1 import threading 2 import time 3 4 def sayhi(num): 5 print('num:',num) 6 time.sleep(3) 7 8 a = threading.Thread(target=sayhi,args=(1,)) 9 b = threading.Thread(target=sayhi,args=(2,)) 10 now1 = time.time() 11 print(now1) 12 a.start() 13 b.start() 14 now2 = time.time() 15 print(now2) 16 print(threading.active_count()) 17 # 包含主线程,总共3个 18 print(a.getName()) 19 print(b.getName()) 20 21 class MyThread(threading.Thread): 22 def

8.12并发编程(二)

隐身守侯 提交于 2020-03-04 10:01:12
一、进程间通信   队列:先进先出   堆栈:先进后出 from multiprocessing import Queue q = Queue(5) # 括号内可以传参数 表示的是这个队列的最大存储数 # 往队列中添加数据 q.put(1) q.put(2) # print(q.full()) # 判断队列是否满了 q.put(3) q.put(4) q.put(5) # print(q.full()) # q.put(6) # 当队列满了之后 再放入数据 不会报错 会原地等待 直到队列中有数据被取走(阻塞态) print(q.get()) print(q.get()) print(q.get()) print(q.empty()) # 判断队列中的数据是否取完 print(q.get()) print(q.get()) print(q.empty()) # print(q.get_nowait()) # 取值 没有值不等待直接报错 # print(q.get()) # 当队列中的数据被取完之后 再次获取 程序会阻塞 直到有人往队列中放入值 """ full get_nowait empty 都不适用于多进程的情况 """ 一、进程间通信IPC机制 1.如何实现:   子进程放数据,主进程获取数据   两个子进程相互放,取数据 from multiprocessing import

多线程的安全隐患

吃可爱长大的小学妹 提交于 2020-03-04 08:28:13
资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象、同一个变量、同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 安全隐患分析: 安全隐患的解决——互斥锁: 互斥锁使用格式 @synchronized(锁对象) { // 需要锁定的代码 } 注意:锁定1份代码只用1把锁,用多把锁是无效的 互斥锁的优缺点: 优点:能有效防止因多线程抢夺资源造成的数据安全问题 缺点:需要消耗大量的CPU资源 互斥锁的使用前提: 多条线程抢夺同一块资源 相关专业术语: 线程同步 线程同步的意思是:多条线程在同一条线上执行(按顺序地执行任务) 互斥锁,就是使用了线程同步技术 原子和非原子属性: OC在定义属性时有 nonatomic 和 atomic 两种选择 atomic :原子属性,为 setter 方法加锁(默认就是 atomic ) nonatomic :非原子属性,不会为 setter 方法加锁 nonatomic 和 atomic 对比 atomic :线程安全,需要消耗大量的资源 nonatomic :非线程安全,适合内存小的移动设备 iOS开发的建议 所有属性都声明为 nonatomic 尽量避免多线程抢夺同一块资源 尽量将加锁、资源抢夺的业务逻辑交给服务器端处理,减小移动客户端的压力 来源: https:/

Android:异步处理之Handler+Thread的应用(一)

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-04 07:48:42
前言   如果你在阅读本文之前,你不知道Handler在Android中为何物,我建议你先看看本系列的第一篇博文《 Android:异步处理之Handler+Thread的应用(一) 》;我们都知道在Android系统中不能在子线程中直接更新UI界面,所以我们一般借助Handler+Thread或者AsyncTask这两种方法来实现UI界面的更新。而Handler+Thread这方法其实就是子线程向UI主线程进行消息传递,通知UI主线程去更新界面的一套机制。因为有时候面试官比较喜欢和蔼可亲的考你Handler的这套机制,所以我们结合源代码深入的研究这套通讯机制是灰常有必要的,你想想如果能鄙视一下面试官,呵呵o(╯□╰)o。。 概述   谷歌的这套消息机制是参考windows设计的,姑爷微爷之间有啥专利官司咱也不关心。一般来说,线程都会通过Looper来建立自己的消息循环,并且锁定一个FIFO的消息队列MessageQueue,Handler通过Looper来实现Message(消息)在MessageQueue中的存取。每一个Hanlder在实例化的时候都会自动或者手动绑定一个Looper,间接向一个MessageQueue发送Message,所以Handler也封装了消息发送和接收的接口。 入门例子   看概述好闷的,琢磨文字不说,晦涩又难懂,记得住又成一个大问题

java并发之ThreadLocal

不想你离开。 提交于 2020-03-04 07:47:39
ThreadLocal的思考: 描述: 方法1:传入秒数,new一个SimpleDataFormat对象,返回时间字符串 方法2:生成两个线程,每个线程都去调用方法1来打印不同秒数的时间 结果:运行正常 进一步思考:要是1000个线程呢?用线程池,生成10线程 进一步思考:在方法1中,每次调用都会new一个SimpleDataFormat对象,浪费开销 解决方法:将SimpleDataFormat作为全局变量 运行结果:线程出现并发冲突问题,会有相同时间结果。原因是多个线程共享了SimpleDataFormat对象。 解决方法:加锁,用synchronized 进一步思考:虽然现在sm只生成了一次,但多个线程在加锁部分部分代码是串行执行的,没有并发,效率低 优化:在线程池有10线程,让每个线程都有自个的sm对象,这样,10线程之间就可以并发执行,sm也没有创建很多个 实现方式: 用ThreadLocal给当前线程赋予独立的变量 另一个场景,服务器接收请求,有用户信息,不同方法使用同一个用户信息。 分析:不同请求对应不同线程,每个线程都用ThreadLocal来保存用户信息,则不会发生冲突,且用户信息也不用作为方法参数传来传去 源码分析: 在Thread对象中,有一个map,key为ThreadLocal对象,value为用户定义的值,这样,每个线程都有独立的变量存储map

android部分面试题

。_饼干妹妹 提交于 2020-03-04 07:01:12
很不幸,今年是一个非常不平平凡的年,由于种种原因,现在加入找工作的行列中,记录面试中所问到的基础与技术问题。 1、内存泄露如何查看和解决 概念:有些对象只有有限的生命周期,当他们的任务完成之后,它们将被垃圾回收,如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,着就会导致内存泄露。 解决方法:使用开源框架LeakCanary检测针对性解决 常见的内存泄露有: 单例造成的内存泄露,例如单例中的Context生命周期大于本身Context生命周期 线程使用Hander造成的内存卸扣,当activity已经结束,线程依然在运行更新UI 非静态类使用静态变量导致无法回收释放造成泄露 WebView网页过多造成内存泄露 资源未关闭造成泄露,例如数据库使用完之后关闭连接 2、Service启动方式 1.startService ①.定义一个类继承service ②.在manifest.xml文件中配置该service ③.使用context的startService(intent)启动该service ④.不再使用时,调用stopService(Intent)停止该服务 2.bindService ①.创建bindService服务段,继承自service并在类中,创建一个实现binder接口的实例对象并提供公共方法给客户端调用 ②.从onbind()回调方法返回此binder实例