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不同进程间的通信 永远遵循 ...
随机推荐
- nginx - 反向代理 - 配置文件模板 - nginx 代理tcp的服务 - 部署示意图
danjan01deiMac:~ danjan01$ cat /usr/local/etc/nginx/nginx.conf|grep -v '^$' worker_processes 1; even ...
- python 爬虫 urllib模块 发起post请求
urllib模块发起的POST请求 案例:爬取百度翻译的翻译结果 1.通过浏览器捉包工具,找到POST请求的url 针对ajax页面请求的所对应url获取,需要用到浏览器的捉包工具.查看百度翻译针对某 ...
- SpringCloud之Zuul 自定义filter
实现过滤器很简单,只需要继承ZuulFilter,并实现ZuulFilter中的抽象方法. filterType():定义过滤器的类型,它有4种类型,分别是pre.post.routing和error ...
- Django2.2 连接mySQL数据库
一.Django2.2连接数据库(踩雷) 首先,Django2.2自带的是sqlite3数据库,但我们学的是mysql,因此学着连接(在mysql环境搭建成功的情况下)---参考博客: https:/ ...
- yum源配置、epel源配置
关键词:yum源,本地yum源,网络yum源 [1]配置本地yum源 1.挂载好光盘到/redhat/mnt/mnt下 mount /dev/cdrom /mnt 2.操作 cd /etc/yum ...
- Oracle块,区,段
数据块(Block) 数据块Block是Oracle存储数据信息的最小单位.注意,这里说的是Oracle环境下的最小单位.Oracle也就是通过数据块来屏蔽不同操作系统存储结构的差异.无论是Windo ...
- 为什么要学习Hive
一 为什么要学习HIVE? 为什么不是ORACLE和MYSQL? 因为大数据时代 数据量成几何倍数增长,并且数据量非常庞大.大到要用PB EB这种量级去衡量.而我们的ORACLE/MYQL这种 ...
- ABC134F Permutation Oddness
Problem Statement Let us define the oddness of a permutation $p = \{p_1, p_2, \dots, p_n\}$ of $\{1, ...
- Docker学习1
命名空间(Namesaoces):Linux内核提供的一种对进程资源隔离的机制,例如网络.进程.挂载点等资源. 控制组(CGroups):Linux内核提供的一种限制进程资源的机制:例如CPU.内存等 ...
- GitHub从小白到熟悉<四>
GitHub issue 使用教程 创建 一个issue (显示所有bug 或者 说 交流的 问题列表)