python_多线程多进程
多线程,适用于IO密集型任务
IO,input,output缩写,包括网路io(比如上传下载),磁盘io,(比如数据库读写),CPU操作不频繁
多进程,适用于CPU密集型任务
数据分析,算法,依赖CPU来运算
进程就是多个资源的集合,
线程是包含在进程里面的,线程和线程直接是相对独立的
线程的优点
1.易于调度。
2.提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
3.开销少。创建线程比创建进程要快,所需开销很少。
4.利于充分发挥多处理器的功能。通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
def down_load():
time.sleep(5)
print('运行完了')
# threading.Thread(target=down_load,args=('name','id')#target是函数名,args是函数的参数没有可以不写
t1 = threading.Thread(target=down_load)
t1.start()#启动线程
每个子线程都是在主线程里启动的子线程
======================================================================================
继承调用
class Test_thread(threading.Thread):#继承threading的Thread类
def __init__(self,num):
threading.Thread.__init__(self)#执行父类的构造方法
self.num = num
def run(self):#运行多线程的函数
while self.num>0:
print(threading.active_count())#打印当前线程数量
self.num-=1
for i in range(5):
t = Test_thread(2)#生成实例
t.start()#启动线程
Python不是真正意义的多线程,Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。对Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。CPU有几个核心就能够同时执行几个任务,Python无法利用多核就是因为它有全局解释器锁(GIL)
==================================================================================================
线程池,线程池在系统启动时即创建大量空闲的线程,程序只要将一个函数提交给线程池,线程池就会启动一个空闲的线程来执行它。当该函数执行结束后,该线程并不会死亡,而是再次返回到线程池中变成空闲状态,等待执行下一个函数。此外,使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Python解释器崩溃,而线程池的最大线程数参数可以控制系统中并发线程的数量不超过此数
下面是一个下载图片的线程池例子:
import threadpool,requests
from hashlib import md5
url_list = ['http://www.nnzhp.cn/wp-content/uploads/2019/10/f410afea8b23fa401505a1449a41a133.png',
'http://www.nnzhp.cn/wp-content/uploads/2019/11/481b5135e75c764b32b224c5650a8df5.png',
'http://www.nnzhp.cn/wp-content/uploads/2019/11/b23755cdea210cfec903333c5cce6895.png',
'http://www.nnzhp.cn/wp-content/uploads/2019/11/542824dde1dbd29ec61ad5ea867ef245.png'] def down_load(url):#下载图片的函数
r = requests.get(url)
m = md5(url.encode())
with open(m.hexdigest()+'.png','wb')as fw:
fw.write(r.content) pool = threadpool.ThreadPool(10)#实例化一个线程池 threadpool实例化一个对象pool,调用了构造函数参数是10
reqs = threadpool.makeRequests(down_load,url_list)#分配数据 for req in reqs:
pool.putRequest(req) #将线程放入线程池 # [pool.putRequest(req) for req in reqs]#列表生成试
pool.wait()#等待线程池结束
print('end')#运行主线程
=====================================================================================================================
守护线程,主线程结束,守护线程马上死掉
import threading
import time
class Fun():
def sum(self,a,b):
time.sleep(2)
print(a+b)
def cut(self,c,d):
time.sleep(5)
print(c-d)
T = Fun()
t1 = threading.Thread(target=T.sum,args=(1,2))
t2 = threading.Thread(target=T.cut,args=(5,4))
t1.setDaemon(True)#设置线程为守护线程
t2.setDaemon(True)#设置线程为守护线程
t1.start()
t2.start()
print('主线程运行完毕') 结果只会打印出'主线程运行完毕'
===================================================================================================================
线程锁,多个线程操作同一个数据的时候 加锁
num = 0
lock = threading.Lock()#申请一把锁 def add():
global num
with lock:#加锁,解锁
num+=1 for i in range(20):
t = threading.Thread(target=add)
t.start() print(num)
===================================================================================================================
多进程
import multiprocessing,time
def down_load():
time.sleep(5)
print('运行完了') if __name__ == '__main__':#windows系统要加,不然会报错 for i in range(5):
p = multiprocessing.Process(target=down_load)#分配5个进程运行函数
p.start()#启动进程
p.join()#等待子进程。子线程互相等待 while len(multiprocessing.active_children())!=0:#等待子进程执行完在执行主进程
pass print(multiprocessing.active_children())#查看有多少个子进程 print(multiprocessing.current_process())#主进程
python_多线程多进程的更多相关文章
- C++程序员面试题目总结(涉及C++基础、多线程多进程、网络编程、数据结构与算法)
说明:C++程序员面试题目总结(涉及C++基础知识.多线程多进程.TCP/IP网络编程.Linux操作.数据结构与算法) 内容来自作者看过的帖子或者看过的文章,个人整理自互联网,如有侵权,请联系作者 ...
- Python有了asyncio和aiohttp在爬虫这类型IO任务中多线程/多进程还有存在的必要吗?
最近正在学习Python中的异步编程,看了一些博客后做了一些小测验:对比asyncio+aiohttp的爬虫和asyncio+aiohttp+concurrent.futures(线程池/进程池)在效 ...
- WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口)
原文 WPF 同一窗口内的多线程/多进程 UI(使用 SetParent 嵌入另一个窗口) WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验.如果希望做不同线程 ...
- Python多线程多进程那些事儿看这篇就够了~~
自己以前也写过多线程,发现都是零零碎碎,这篇写写详细点,填一下GIL和Python多线程多进程的坑~ 总结下GIL的坑和python多线程多进程分别应用场景(IO密集.计算密集)以及具体实现的代码模块 ...
- python GIL全局解释器锁,多线程多进程效率比较,进程池,协程,TCP服务端实现协程
GIL全局解释器锁 ''' python解释器: - Cpython C语言 - Jpython java ... 1.GIL: 全局解释器锁 - 翻译: 在同一个进程下开启的多线程,同一时刻只能有一 ...
- python实现并发服务器实现方式(多线程/多进程/select/epoll)
python实现并发服务器实现方式(多线程/多进程/select/epoll) 并发服务器开发 并发服务器开发,使得一个服务器可以近乎同一时刻为多个客户端提供服务.实现并发的方式有多种,下面以多进 ...
- 多线程&多进程解析:Python、os、sys、Queue、multiprocessing、threading
当涉及到操作系统的时候,免不了要使用os模块,有时还要用到sys模块. 设计到并行程序,一般开单独的进程,而不是线程,原因是python解释器的全局解释器锁GIL(global interpreter ...
- GDB 调试多线程多进程
GDB是linux下的调试利器,在c/c++程序开发过程中必不可少的.这里总结一下多进程和多线程的调试方法和技巧. 多进程的调试: 如下示例 #include <sys/mman.h> # ...
- 多线程/多进程/异步IO
SOCK_STREAM :TCPSOCK_Dgram :UDP family=AF_INET: 服务器之间的通信AF_INET6: 服务器之间的通信AF_UNIX: Unix不同进程间的通信 永远遵循 ...
随机推荐
- 关于虚拟机docker 启动mysql 启动成功但未挂载到端口
首先排查了防火墙和其他权限相关问题 然后检查了mysql 用户权限问题 docker logs 查看日志 正常应该是到3306 问题是我的mysql my.cnf 文件是挂在在本地.当第二次启动容器时 ...
- JSON与对象,集合之间的转换
https://www.cnblogs.com/xiatc/p/8952739.html
- 2019牛客暑期多校训练营(第二场)-D Kth Minimum Clique
题目链接:https://ac.nowcoder.com/acm/contest/882/D 题意:求给定点权无向图中,点权和第k小的完全子图的点权和.(包括空集) 思路:从空集开始,每找到一个完全子 ...
- 西安邀请赛-L(打表找规律)
题目链接:https://nanti.jisuanke.com/t/39279 题意:给定n个不同的数表示的序列,定义两种操作:1. 交换前一半和后一半(如果有奇数个,则中间的不管).2. 交换每个偶 ...
- [转帖]docker-compose
docker-compose https://www.cnblogs.com/embedded-linux/p/10714179.html 需要学习使用一下. 改天自己再改改用过的yaml文件. ...
- 在Ubuntu上安装Hbase
1.下载hbase2.0.5 解压缩并改名为hbase目录,放到/usr/local下(注意权限) sudo mv ~/hbase-2.0.5 /usr/local/hbase 2.修改目录所有者 / ...
- python __dict__ 跟 dir()的区别
__dict__:要是对象的话返回的是一个对象自身的实例属性.不包括类的属性:要是类的__dict__则不包括父类的属性,只包含自身类属性[方法.类变量],不包括实例属性.正是这样.每个实例的实例属性 ...
- Java重要类之LinkedList
一.ArrayList与LinkedList 基本概念:List是一个接口,Arraylist和LinkedList是它的两个实现类,只是实现的方式不一样.我在“单链表java实现”一文中已经对单链表 ...
- pc端和移动端的“窗口”(viewport)故事(part1)
A tale of two viewports - part one 在以下的系列文章中,我将为大家解释浏览器中的视窗和一些重要的元素的尺寸是如何起作用的,如:大家最熟悉的html元素以及window ...
- Hadoop学习之 HIVE 多用户模式安装
一.启动hadoop 集群 1.启动zookeeper 集群 zkServer.sh start 2.在master.hadoop 机器上 ./start-all.sh 由于 start-all命 ...