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不同进程间的通信 永远遵循 ...
随机推荐
- Elasticsearch Metric聚合
首先查看index文档信息 $ curl -XGET "http://172.16.101.55:9200/_cat/indices?v" 输出 health status ind ...
- [Python3] 038 函数式编程 偏函数
目录 函数式编程 之 偏函数 1. 关于强制类型转换 int 的补充 2. 利用 int 新建函数 3. functools.partial 函数式编程 之 偏函数 1. 关于强制类型转换 int 的 ...
- PTA(Basic Level)1037.在霍格沃茨找零钱
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 -- 就如海格告诉哈利的:"十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.& ...
- 搞懂MySQL GTID原理
从MySQL 5.6.5 开始新增了一种基于 GTID 的复制方式.通过 GTID 保证了每个在主库上提交的事务在集群中有一个唯一的ID.这种方式强化了数据库的主备一致性,故障恢复以及容错能力. GT ...
- python简单验证码识别
在学习python通过接口自动登录网站时,用户名密码.cookies.headers都好解决但是在碰到验证码这个时就有点棘手了:于是通过网上看贴,看官网完成了对简单验证码的识别,如果是复杂的请看大神的 ...
- 什么是分布式关系型数据库服务 DRDS
DRDS 产品简介 DRDS 是一款基于 MySQL 存储.采用分库分表技术进行水平扩展的分布式 OLTP 数据库服务产品,支持 RDS for MySQL 以及 POLARDB for MySQL, ...
- skiplist(跳表)的原理及JAVA实现
前记 最近在看Redis,之间就尝试用sortedSet用在实现排行榜的项目,那么sortedSet底层是什么结构呢? "Redis sorted set的内部使用HashMap和跳跃表(S ...
- innodb中一颗B+树能存储多少条数据
如图,为B+树组织数据的方式: 实际存储时当然不会每个节点只存3条数据. 以InnoDB引擎为例,简单计算一下一颗B+树可以存放多少行数据. B+树特点:只有叶子节点存储数据,而非叶子节点存放的是用来 ...
- Spring Cloud Alibaba nacos 配置中心使用
背景 上一文我们讲到了如何去搭建注册中心,这一次我们讲述如何使用nacos作为注册中心 spring-cloud-alibaba-basis 创建基础依赖 首先我们创建一个spring-cloud-a ...
- Select2的远程数据操作
一.概述 如果下拉列表框中的内容太多,最好是使用Select2的远程数据进行筛选. 二.参考文献 https://select2.github.io/examples.html#data-ajax h ...