python多线程

Android性能优化--启动优化

自闭症网瘾萝莉.ら 提交于 2019-12-10 18:01:50
1. 前言 一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序。本文会通过以下几个方面来介绍应用启动的相关指标和优化,提供应用的启动速度。 整体文章思路如下: 2. 冷启动&热启动 通常来说,启动方式分为两种:冷启动和热启动。 **冷启动:**当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动。 **热启动:**当启动应用时,后台已有该应用的进程(例:按back键、home键,应用虽然会退出,但是该应用的进程是依然会保留在后台,可进入任务列表查看),所以在已有进程的情况下,这种启动会从已有的进程中来启动应用,这个方式叫热启动。 两者之间的特点如下: 冷启动:系统会重新创建一个新的进程分配给该应用,从Application创建到UI绘制等相关流程都会执行一次。 热启动:应用还在后台,因此该启动方式不会重建Application,只会重新绘制UI等相关流程。 冷热启动时间的计算命令: adb shell am start -W [packageName]/[packageName.XxxActivity] 参数说明: 1、ThisTime:一般和TotalTime时间一样

Python 线程和进程(2)

喜欢而已 提交于 2019-12-10 07:59:19
IO操作不占用cpu 计算占用cpu python多线程 不适合cpu密集操作类型的任务 适合IO操作密集型任务 简单一个进程实例: import multiprocessing #进程模块 import time def run(name,proce): time.sleep(1) print("hello",name,proce) if __name__ == '__main__': for i in range(10): p = multiprocessing.Process(target=run,args=('liyang',i,)) p.start() p.join() 进程里面能起线程吗?当然可以: # -*- coding:utf-8 -*- # Author:Brownyangyang import multiprocessing import time import threading def threadtest(): print(threading.get_ident()) ##获取线程号 def run(name,proce): time.sleep(2) print("hello",name,proce) t = threading.Thread(target=threadtest,) t.start() if __name__ == '__main__'

进程剩余部分和线程

偶尔善良 提交于 2019-12-10 05:56:41
目录 1创建进程的2种方式 2.子进程回收资源的2种方式 3.守护进程 1创建进程的2种方式 # 创建进程的2种 方式 from multiprocessing import Process #方式一 def task(): pass p_obj = Process(target = task) #告诉操作系统,让它 去创建一个子进程 p_obj.start() #让主进程等待子进程结束后,在结束,并销毁 p_obj.join() #方式二 class MyProcess(Process): def run(self): pass p_obj = MyProcess() #告诉操作系统,让他创建一个子进程 p_obj.start() #让主进程 等待子进程结束后并销毁 p_obj.join() 2.子进程回收资源的2种方式 1.join让主进程等待子进程结束后,并回收子进程资源,主进程再结束并回收资源 。 2.主进程“正常结束”,子进程也和主进程一并被回收 from multiprocessing import Process import time def task(): print('start....') time.sleep(10) print('end...') if __name__ == '__main__': obj = Process(target = task)

day30

微笑、不失礼 提交于 2019-12-10 03:21:14
GIL(全局解释器锁) 在CPython中,全局解释器锁(GIL)是一个防止多个锁的互斥锁。 本机线程从执行Python字节码一次。这把锁主要是必须的因为CPython的内存管理不是线程安全。(然而,自从GIL存在时,其他功能已逐渐依赖于它所实施的保证。) 基于CPython来研究全局解释器锁 1.GIL本质是一个互斥锁 2.GIL是为了阻止同一个进程内多个线程同时执行(并行) — 单个进程下的多个线程无法实现并行,但能实现并发 3.这把锁主要是因为CPython的内存管理不是"线程安全"的 — 内存管理 — 垃圾回收机制 注意:多个线程过来执行,一旦遇到IO操作,就会立马释放GIL解释器锁,交给下一个先进来的线程 Copyimport time from threading import Thread, current_thread number = 100 def task(): global number number2 = number # time.sleep(1) number = number2 - 1 print(number, current_thread().name) for line in range(100): t = Thread(target=task) t.start() 死锁现象 Copyfrom threading import Lock,

testng.xml 配置大全

可紊 提交于 2019-12-09 22:53:43
1.TestNG的运行方式如下: 1 With a testng.xml file 直接run as test suite 2 With ant 使用ant 3 From the command line 从命令行 4 IDE 直接在IDE中执行 在IDEA中直接运行的时候,需要说明的是:可以运行一个测试类,也可以单独运行一个测试的方法。 在IDEA里执行,只需要右键,点击 Run xxx 即可。 如果是在某一个方法的代码块里右键,出现的是 Run methodName ,即只运行当前的方法; 如果是在类的代码块里右键,出现的是 Run className ,即运行当前类中的所有Test方法; 也可以创建testng.xml,右键出现的 Run path/testng.xml ,即运行该配置文件中需要运行的方法。 2.TestNG常见的注解: 注解 描述 @DataProvider 为测试方法提供数据 @BeforeMethod 在每个测试方法 前 执行 @AfterMethod 在每个测试方法 后 执行 @BeforeClass 被注释的方法将在当前类的第一个测试方法调用前运行 @AfterClass 被注释的方法将在当前类的所有测试方法调用后运行 @BeforeGroups 被配置的方法将在列表中的 gourp前运行。这个方法保证在第一个属于这些组的测试方法调用前立即执行

进程补充和线程

三世轮回 提交于 2019-12-09 21:05:10
进程补充和线程 1.子进程回收资源的两种方式: 1)join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源 ​ 2) 主进程“正常结束”,子进程与主进程一并被回收资源 2.僵尸进程与孤儿进程 僵尸进程(有坏处): 在子进程结束后,主进程没有正常结束,子进程PID不会被回收 缺点: 操作系统中的PID号是有限的,如果有子进程pid号无法正常回收,则会占用pid号 资源会浪费,若pid号满了,则无法创建新的进程 孤儿进程(无坏处): 在子进程没有结束时,主进程没有“正常结束”,子进程pid不会被回收 但是在操作系统中: 操作系统优化机制: ​ 当主程序意外终止时,操作系统会检测是否有正在运行的子进程,会把他们放入孤儿院中,让操作系统帮你自动回收 进程的属性与方法: from multiprocessing imprt Process from multiprocessing import current_process import os import time # os.getpid()查看主进程的pid # os.getppid()查看主主进程的pid # 在子进程中调用,可以拿到子进程对象.pid可以拿到pid号 # 在主进程中调用,可以拿到主进程对象.pid可以拿到pid号 def task(): print(f'start.....{current

协程

孤人 提交于 2019-12-09 19:27:41
目录 一 什么是协程? 二 协程介绍 三 Gevent 一 什么是协程? ​ 进程:资源单位 ​ 线程:执行单位 ​ 协程:单线程下实现并 在IO密集型的情况下,使用协程能提高最高效率 注意:协程不是任何单位,只是程序员YY出来的东西 手动实现 “遇到IO切换 + 保存状态“ 去欺骗操作系统,让操作系统误以为没有IO操作,将CPU的执行权限给你 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制), 第一种情况是该任务发生了阻塞 第二种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它 一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。 为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 #2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 单纯的切换反而会降低运行效率 ''' 1、协程: 单线程实现并发 在应用程序里控制多个任务的切换+保存状态 优点: 应用程序级别速度要远远高于操作系统的切换 缺点:

GIL以及协程

左心房为你撑大大i 提交于 2019-12-09 19:25:08
GIL以及协程 一、GIL全局解释器锁 演示 ''' python解释器: - Cpython c语言 - Jpython java 1、GIL:全局解释器锁 - 翻译:在同一个进程下开启的多个线程,同一时刻只能有一个线程执行,因为Cpython的内存管理不是线程安全。 - GIL全局解释器锁,本质上就是一把互斥锁,保证数据安全 定义: In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.) 结论:在Cpython解释器中,同一个进程下开启的多线程,同一时刻只能有一个线程执行,无法利用多多核优势。 GIL全局解释器的优缺点: 优点: 保证数据的安全 缺点: 单个进程下,开启多个线程

python写爬虫4-多线程爬虫(采集58出租房信息)

♀尐吖头ヾ 提交于 2019-12-08 21:57:54
python写爬虫4-多线程爬虫(采集58出租房信息) 本文代码是在【python写爬虫3-MongoDB数据缓存(采集58出租房信息)】 http://blog.csdn.net/apple9005/article/details/54967916 博文的基础上编写 运行【python写爬虫3-MongoDB数据缓存(采集58出租房信息)】中的代码爬取信息,你会发现,爬取一个列表页的详细数据(大约150条左右)会需要一段时间。可见串行爬虫的爬取效率并不高,如何降低爬取数据所花费的时间呢?本文使用多线程来降低爬取时间。 1.先来一个Python的线程小事例 直接使用python的内置模块threading #!/usr/bin/env python # -*- coding: utf-8 -*- import threading from time import ctime, sleep def music (func) : for i in range( 2 ): print 'I was listening to %s.%s' % (func, ctime()) sleep( 1 ) def move (func) : for i in range( 2 ): print "I was at the %s!%s" % (func, ctime()) sleep( 5 )

说说Python多线程中的daemon属性方法

女生的网名这么多〃 提交于 2019-12-07 03:51:35
大家看多线程部分的时候肯定看到过daemon这个属性,当我在百度了一圈后也没发现有比较好的解释(或者大家对这个解释都非常清楚),于是自己通过代码和官方介绍了解它,进行了一些总结 给大家一些参考。 首先我们看官方的介绍是这样的: A boolean value indicating whether this thread is a daemon thread (True) or not (False). This must be set before start() is called, otherwise RuntimeError is raised. Its initial value is inherited from the creating thread; the main thread is not a daemon thread and therefore all threads created in the main thread default to daemon = False. The entire Python program exits when no alive non-daemon threads are left. 大概的意思就是说:这个属性为一个布尔值,表示是否为一个守护进程,且这个属性设置必须在线程的start方法开始之前调用。它的值继承自主线程