python学习笔记(二十七)多线程与多进程
线程是程序里面的最小执行单元。
进程是资源的集合。
线程是包含在一个进程里面,一个进程可以有多个线程,一个进程里面默认有一个主线程。由主线程去启动子线程。
1.多线程
import threading,time def run():time.sleep(3) #干活需要3sprint('哈哈哈') ######################################### for i in range(5): #串行run() ######################################### for i in range(5): #并行,多线程, 就是N个线程一起在干活t = threading.Thread(target=run) #实例化了一个线程t.start() #########################################
2.多线程等待
举个栗子:我们定义一个urls字典,然后用并行和串行分别扒一下这些url上的内容,并统计时间。
urls = {'besttest':'http://www.besttest.cn','niuniu':'http://www.nnzhp.cn','dsx':'http://www.imdsx.cn','cc':'http://www.cc-na.cn','alin':'http://limlhome.cn' }
需要定义一个扒网页内容的函数,如果后面需要统计每个子线程的耗时,那么就需要在这个函数中定义start_time和end_time,函数如下:
data= {} def down_html(file_name,url):start_time = time.time()res = requests.get(url).contentopen(file_name+'.html','wb').write(res)end_time = time.time()run_time = end_time-start_timedata[url] = run_time
所有的代码如下:
import requests,time,threading data= {} def down_html(file_name,url):start_time = time.time()res = requests.get(url).contentopen(file_name+'.html','wb').write(res)end_time = time.time()run_time = end_time-start_timedata[url] = run_time threads = [] start_time = time.time() for k,v in urls.items(): #5次t = threading.Thread(target=down_html,args=(k,v)) #多线程的函数如果传参的话,必须得用argst.start()threads.append(t) #6个线程 #进程里面默认有一个线程,这个线程叫做主线程 for t in threads:t.join() #多线程等待,主线程循环等待5个子线程执行结束end_time = time.time() run_time = end_time - start_time print(data) print('下载总共花了xxx时间',run_time)
3.守护线程
import threading,time def run():time.sleep(3)print('哈哈哈')for i in range(50):t = threading.Thread(target=run)t.setDaemon(True) #把子线程设置成为守护线程t.start() print('Done,运行完成。') #当主线程运行完成后就立即结束子线程。所以运行结果只输出了“Done,运行完成”。子线程并没有来得及打印“哈哈哈”就被结束了。
4.线程锁
import threading,time num = 1 lock = threading.Lock() #申请一把锁def run():time.sleep(1)global numlock.acquire() #加锁num+=1lock.release() #解锁 ts = [] for i in range(100):t = threading.Thread(target=run)t.start()ts.append(t) [t.join() for t in ts] #列表生成式,多线程等待 print(num)
5.多进程和多进程等待
import multiprocessing,threading def my():print('哈哈哈')def run(num):for i in range(num): #启动num个线程t = threading.Thread(target=my)t.start() if __name__ == '__main__':for i in range(5): #启动5个进程p = multiprocessing.Process(target=run,args=(6,)) #启动一个进程,如果参数只有一个,那么参数后面一定要加一个逗号p.start()# 进程5个# 每个进程下启动6个线程 #进程等待也可以用pjoin()
总结:
1、如果子线程运行的函数里面有返回值该怎么处理?
如果子线程运行的函数里面有返回值,是不能获取到的,只能在外面定义一个list或字典来存放每次处理的结果。
2、电脑有几核就能同时运行几个线程。但是,python的多线程只能利用一个CPU的核心。
3、锁,在多线程同时修改一个数据或文件的时候,可能会把数据覆盖,在python2里面需要加锁,python3里面不加锁也无所谓,默认会自动帮你加锁。
4.守护线程,只要主线程结束,那么子线程立即结束,不管子线程有没有运行完成。
5、多进行,多用于处理CPU密集型任务;多线程,多用于IO密集型任务。
转载于:https://www.cnblogs.com/mululu/p/9118411.html
python学习笔记(二十七)多线程与多进程相关推荐
- python学习笔记(二十七) -- 常用内建模块(二) Base64、MD5、SHA1、hmac
目录 base64 hashlib MD5 SHA1 hmac base64 原理 base64就是对二进制数据进行编码,比如我有6字节的二进制数据,然后每3个字节分为一组,也就是一组有3*8 = 2 ...
- 从滚动条到画布的几个代码文件——Python学习笔记之十七
从滚动条到画布的几个代码文件--Python学习笔记之十七 这一章的继续学习,比在前的照片涉及代码要轻松一些,代码打完后的预期结果总能实现.特别让人欣慰的一点,文本上的文字理解好像上了一个台阶,不用多 ...
- python学习笔记(二) 基本运算
python学习笔记(二) 基本运算 1. 条件运算 基本语法 if condition1: do somethings1elif condition2: do somethings2else: do ...
- uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善
uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善 uniapp 学习笔记二十七 购物车总价计算及弹窗交互逻辑完善 cart.vue <template><view> ...
- Mr.J-- jQuery学习笔记(二十七)--DOM操作方法(删除获取文本)
清除 <body> <button>调用remove</button> <div>我是div<p>我是段落</p> </d ...
- python学习笔记二
1 正则 1-1 普通字符 s1 = 'asd25454655js6565askJ\nNKJLasd5165123' # 1 匹配单个大写英文字母 obj = re.compile('[A-Z]') ...
- Python学习笔记(十七)——Pandas库
数组只能存储一种类型的数据, 同时, 数组提供了许多方便统计计算的功能 (如平均值 mean .标准差 std 等) pandas与numpy的区别 pandas 是基于 numpy 数组构的, 但 ...
- (10.1)Python学习笔记二
1.在项目工程中要模块化测试一个开发的功能,在测试通过后交付给项目组其他人员继续开发.要保证代码开发的性能和效率以及可扩展性. 2.项目工程中的文件夹分类要功能模块明确清晰,在python中引入某一个 ...
- python学习笔记(二十三) -- 多进程和多线程
目录 多线程多进程的意义 多进程的使用 方式一(fork): 只能在Unix/Linux/Mac系统下执行,windows不可以 方式二(multiprocessing.Process): 全平台通 ...
- python学习笔记第十七天------------MySQL数据库
文章目录 1. 数据库简介 1.1 RDBMS 1.2 SQL 1.3 MySQL 简介 2. 数据完整性 3. 数据库的指令 4. 数据表的指令 5. 增删改查(curd) 6. 数据库设计 7. ...
最新文章
- linux远程登录x11,windows linux 通过SSH X11Forwrding 使用图形化界面
- Android SQLite数据库的详细使用
- [Android工具]更新安卓百度云盘百度网盘资源搜索工具,安卓网盘搜索软件
- Python自动化开发学习22-Django下(Form)
- SAP UI5 初学者教程之七 - JSON 模型初探试读版
- 【Hitachi2020C】ThREE【构造】【二分图染色】
- Linux内核中流量控制(4)
- Python笔记(6) 数字
- 通过as写一个简单的按键_自己写一个简单的二维魔方游戏
- undefined reference问题总结
- torch.cat;Pytorch nn.MaxPool1d
- java基础---Java---面试题---银行业务调度系统(线程同步锁、枚举、线程池)
- Ubuntu下录制gif动图
- python实部和虚部_Python复数表示表示和计算
- 【Coding】Latex添加表格注释footnote
- 斐讯路由器虚拟服务器怎么设置,斐讯PSG1218路由器如何设置
- vue简单实现多功能弹幕(比上一个好)
- LifeCycle 的使用和原理
- 二、SonarQube自定义规则
- 【记一次kafka启动报org.apache.zookeeper.KeeperException$NoAuthException:=Noauth for/consumers】
热门文章
- linux限制ip带宽,apache如何限制并发数 IP 带宽?
- IIS优化-解决IIS访问速度慢问题
- webplayer 设置加载图标和屏蔽右键
- java地铁最短,地铁最短路径
- 簡單設定 kernel 選項在使用 iptables 前
- springboot中关于springMvc默认配置,配置扩展,全面接管
- 将一个字段的多个记录值合在一行
- 基于JDBC从数据库中读取数据,在百度地图批量标注地点
- asio::io_service被废弃的问题
- 一张纸厚度是多少毫米_一张纸对折后的厚度,有多可怕!——北京市第二十中学教科室“科技云课堂”(4)...