python进阶--多线程多进程
一、线程和进程
进程是拥有独立内存,能够独立运行的最小单位,也是程序执行的最小单位,线程是程序运行过程中,一个单一的顺序控制流程,是程序执行流的最小单位,一个进程至少包含一个线程,多线程共享进程的内存空间和上下文环境,线程上下文切换比进程上下文切换要快得多
二、python与多线程
python中多线程涉及模块-----threading模块
1. 多线程
- import threading,time,requests
- def downHtml(url,name):#下载网页
- content=requests.get(url).content#返回的是二进制的内容
- f=open(name+'.html','wb')#打开html文件
- f.write(content)#将下载网页的内容写到文件中
- f.close()#关闭文件
- urls=[#url列表
- ['aaa','http://www.aaa.cn'],
- ['bbb','http://www.bbb.cn'],
- ['ccc','http://www.ccc.cn'],
- ]
- start_time=time.time()#记录程序执行前时间
- threads=[]
- for url in urls:
- #实例化线程类,接收连个参数,一个是函数名,第二个是函数需要的参数,args代表接收多个参数,用逗号隔开,如果是一个参数时,也要写逗号,否则会当字符串处理
- t=threading.Thread(target=downHtml,args=(url[1],url[0]))
- #启动线程活动
- t.start()
- threads.append(t)
- #为什么时间统计完,程序还没有结束?因为线程是独立的,在运行py时,默认有个主线程, 主线程导入模块,读代码,执行代码-起了三个子线程后,主线程继续执行,执行完,就显示时长了,也就是这个时间只包括主线程的执行时间,不包含三个子线程执行程序的时间
- #解决办法,让主程序等待子程序都执行完再统计时间
- for t in threads:#循环等待3个子线程都执行完
- t.join()#主线程等待子线程结束,
- end_time = time.time()
- print(end_time-start_time)
2.多线程处理返回结果
启动多线程调用有返回值的函数时,返回值是获取不到的,
解决办法,将返回值加到一个数组中
- import threading
- res=[]
- def sum(x,y):
- res.append(x+y)
- for i in range(5):
- t=threading.Thread(target=sum,args=(i,i))
- t.start()
- print(res)
- #返回结果[0,2,4,6,8]
3.守护线程
设置线程为Daemon后,也就是设置线程为守护线程后,主线程运行完,不管守护线程有没有执行完,立马销毁,也就是主线程需要等非守护线程执行结束才能结束,不需要等守护线程。如果想和主线程一起销毁就设置为守护线程,如果想让主线程等待这个线程执行完后销毁,则不要设置为守护线程
- import threading,time
- def pz():
- print(‘’)
- time.sleep(2)
- print('守护线程')
- #threads=[]
- for i in range(50):
- t=threading.Thread(target=pz)
- #设置子线程为守护线程,主线程一旦结束,子线程立马结束,不管子线程有没有执行完成
- t.setDaemon(True)
- t.start()
- #threads.append(t)
- #如果主线程等待子进程,设置的守护进程就无效了
- #for i in threads:
- # t.join()
- print('done')
- #因为守护进程要等待2s,主进程只是打印done很快,所以最后输出只有done,主进程不等守护进程执行结束
4.线程锁
多线程在同时修改同一个全局变量时,可能会造成数据错误,为了避免这种错误,可以使用线程锁,python3可以不加,程序会自动加锁
- import threading
- from threading import Lock
- num = 0
- lock = Lock() # 申请一把锁
- def run():
- global num
- lock.acquire() # 加锁
- num += 1
- lock.release() # 解锁
- lis = []
- for i in range(5):
- t = threading.Thread(target=run)
- t.start()
- lis.append(t)
- for t in lis:
- t.join()
- print('over', num)
- #返回结果:over 5
5.多进程
多线程不能利用多核cpu,多进程可以, 启动多进程使用multiprocessing模块
- import multiprocessing,threading,time
- def run2():
- print('这是多线程启动的')
- def run():
- time.sleep(2)
- print('多进程')
- for i in range(5):#每个进程中启动5个线程
- t=threading.Thread(target=run2)
- t.start()
- if __name__=='__main__':#启动进程必须放在这个里面
- for i in range(5):
- p=multiprocessing.Process(target=run)#启动5个进程
- p.start()
python进阶--多线程多进程的更多相关文章
- python进阶(二) 多进程+协程
我们大多数的时候使用多线程,以及多进程,但是python中由于GIL全局解释器锁的原因,python的多线程并没有真的实现 实际上,python在执行多线程的时候,是通过GIL锁,进行上下文切换线程执 ...
- 『Python进阶』多进程多线程快速上手
线程池快速上手 from concurrent.futures import ThreadPoolExecutor from utils import * workers = 8 with Threa ...
- 静听网+python爬虫+多线程+多进程+构建IP代理池
目标网站:静听网 网站url:http://www.audio699.com/ 目标文件:所有在线听的音频文件 附:我有个喜好就是听有声书,然而很多软件都是付费才能听,免费在线网站虽然能听,但是禁ip ...
- python 爬虫 多线程 多进程
一.程序.进程和线程的理解 程序:就相当于一个应用(app),例如电脑上打开的一个程序. 进程:程序运行资源(内存资源)分配的最小单位,一个程序可以有多个进程. 线程:cpu最小的调度单位,必须依赖 ...
- python进阶(一) 多进程并发机制
python多进程并发机制: 这里使用了multprocessing.Pool进程池,来动态增加进程 #coding=utf-8 from multiprocessing import Pool im ...
- Python之多线程多进程
(一)进程 1.定义 进程:就是一组资源的集合.一个程序就是一个进程. 线程是用来干活的,只有进程的话是没办法运行的,进程里其实是线程在具体干活的. import threading import t ...
- python进阶(15)多线程与多进程效率测试
前言 在Python中,计算密集型任务适用于多进程,IO密集型任务适用于多线程 正常来讲,多线程要比多进程效率更高,因为进程间的切换需要的资源和开销更大,而线程相对更小,但是我们使用的Python ...
- Python的多线程(threading)与多进程(multiprocessing )
进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...
- Python进阶【第二篇】多线程、消息队列queue
1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...
随机推荐
- javascript如何处理字符串中的\u
问题: 字符串在页面显示的时候,有\u,如:Tesla\u8fc1\u79fb ,想要显示它的原文 let a = 'Tesla\u8fc1\u79fb' //显示 Tesla迁移 alert( un ...
- HDU 6150 - Vertex Cover | 2017 中国大学生程序设计竞赛 - 网络选拔赛
思路来自 ICPCCamp /* HDU 6150 - Vertex Cover [ 构造 ] | 2017 中国大学生程序设计竞赛 - 网络选拔赛 题意: 给了你一个贪心法找最小覆盖的算法,构造一组 ...
- git commit 详解
git commit 命令用来将本地暂存的修改提交到版本库. git commit -m '提交信息'. 我们用的比较多的应该就是-m 参数.添加提交信息. 经常手抖的同学可能会知道,git comm ...
- 添加QQ群
点击右边添加 <a target=" src="//pub.idqqimg.com/wpa/images/group.png" alt="陆小果哥 ...
- 通过无线网络使用ADB ( Connect to android with ADB over TCP )
之前用USB数据线连接电脑和android手机,用adb操控手机. 后来电脑前面板的USB全坏了,键盘.鼠标.USBKkey.打印机都需USB, 少一个USB口,只得对不常用设备进行插拔切换. 于是 ...
- Cogs 1345. [ZJOI2013] K大数查询(树套树)
[ZJOI2013] K大数查询 /* 树套树写法. bzoj过不了. 可能有负数要离散吧. 线段树套线段树. 外层权值线段树,内层区间线段树维护标记. 对权值建一棵权值线段树. 某个点表示权值在某个 ...
- vue中.sync修饰符,实现子组件实时更新父组件的值
vue 修饰符sync的功能是:当一个子组件改变了一个 prop 的值时,这个变化也会同步到父组件中所绑定. 不过它有一个前身,先来看看.sync出现之前是如何实现的 父组件中(传递给子组件一个值:p ...
- vscode设置VUE eslint开发环境
我的使用vscode开发VUE的常用设置 1.安装插件 ESLint Vetur Beautify Prettier - Code formatter Auto Rename Tag -重命名标签,闭 ...
- Python学习日记(九)—— 模块二(logging、json&pickle、xml、requests、configparser、shutil、subprocess)
logging模块 用于便捷记录日志且线程安全的模块(便捷的写文件的模块,不允许多个人同时操作文件) 1.单文件日志 import logging logging.basicConfig(filena ...
- Egyptian Collegiate Programming Contest (ECPC 2015)
题目链接:https://vjudge.net/contest/155219#overview. A题,用全排列来找出比当前这个数字字典序还大的排列有几个,然后前缀和dp即可.据说可以康拓展开来快速找 ...