多进程 multiprocessing 多线程Threading 线程池和进程池concurrent.futures
multiprocessing.procsess
定义一个函数
def func():pass
在if __name__=="__main__":中实例化
p = process(target=子进程要执行的函数,args(函数的参数且必须以元组的方式传参))
p.start() 开启子进程
p.join() 感知子进程的结束,主进程等待子进程执行完后才退出
p.terminate() 结束一个子进程
p.is_alive() 查看某个进程是否还在运行 属性
p.name p.pid 进程名和进程号
p.deamon 守护进程,主进程的代码执行完,子进程也随即结束,在子进程开始执行前设置
用类开启子进程的方式,必须有run()
Myprocsess(procsess):
def __init__(name,*args,**kwargs):pass
def run():pass
p = Myprocsess('name') **在子进程中不要出现input
# lock semaphore event queue joinableQueue 对象在主进程创建 multiprocessing.Lock
实例化 锁 对数据的一种保护方式,一次只能一个进程对数据进行操作
l = Lock()
l.acquire() 拿钥匙 加锁,其他进程不能访问
l.release() 还钥匙 释放锁,释放了之后,其他进程才能拿锁对数据进行操作
其余进程阻塞等待 multiprocessing.semaphore
实例化信号量,传入同时允许访问的进程的数量
sem = semaphore(4)
sem.acquire() 获取钥匙,同时允许4个进程访问
sem.release() 还钥匙,让其他进程得以访问 multiprocessing.Event
通过一个信号来控制多个进程,一个信号可以让所有的进程都阻塞,也可以解除所有进程的阻塞
e = Event()
e.is_set() 查看一个事件的状态,默认被设置成False阻塞,True为不阻塞
e.set() 修改一个事件的状态为Ture
e.clear() 修改一个事件的状态为Flase
e.wait() 是依据事件的状态来决定是否阻塞,Flase阻塞,True不阻塞 multiprocessing.Queue
队列 先进先出
q = Queue(队列数)
q.put() 放一个进队列
q.get() 从队列中取一个出来
q.full() 队列是否满了
q.empty() 队列是否空了 multiprocessing.JoinableQueue
q = JoinableQueue(20)
q.put() 放入队列,count +1
q.join() # 阻塞 直到一个队列中的所有数据 全部被处理完毕
q.get() 取消息
q.task_done() # count -1 在处理完get到的消息后,处理完毕后告诉队列 # 队列中只能存放实例化时设置的参数的个数,队列未满才会继续put
# 使用JoinableQueue,get()后用.task_done(),这样队列put端put后的join将在最后一次调用task_done后不阻塞 multiprocessing.Pipe
con,pro = Pipe() # 数据不安全性,加锁
process(func,args=(con,pro))
con.recv()
con.close()
pro.send(f)
pro.close()
# con,pro不用send或recv就close,只留一个recv取完数据将会引发EOFError异常
multiprocessing.Manager
m = Manager()
dic=m.dict({'count':100})
p = Process(target=func,args=(dic,l))
# manager数据间的共享,不同子进程对数据修改,主进程可拿值,不安全,加锁 multiprocessing.Pool
p = Pool(5)
p.map(func,iterable) # 默认的异步执行任务,切自带close和join功能 p.Pool(5)
p.apply_async(func,args=(i,)) # 异步调用 和主进程完全异步
p.close() # 结束进程池接收任务
p.join() # 感知进程池中的任务执行结束 res = p.apply_async(func,args=(i,)) # 返回对象
对象.get() # 阻塞等待结果 func对象的计算返回结果
ret = p.map(func,iterable) # 等待所有的进程执行完,将func的计算结果用列表返回 p.apply_async(func,args=(i,),callback=func2) # 回调函数是在主进程执行
# 回调函数,不能接收参数,只能将func的执行结果作为参数传给回调函数
多线程Threading
# 多线程和多进程的使用类似。
# 进程 是 最小的 内存分配单位
# 线程 是 操作系统调度的最小单位
# 线程直接被CPU执行,进程内至少含有一个线程,也可以开启多个线程
# 开启一个线程所需要的时间要远远小于开启一个进程
# 多个线程内部有自己的数据栈,数据不共享
# 全局变量在多个线程之间是共享的
# GIL锁(即全局解释器锁)
# 在Cpython解释器下的python程序 在同一时刻 多个线程中只能有一个线程被CPU执行
# 高CPU : 计算类 --- 高CPU利用率
# 高IO : 爬取网页 200个网页 # qq聊天 send recv # 处理日志文件 读文件 # 处理web请求 # 读数据库 写数据库
threading.Thread(target=wahaha,args=(i,)).start()
print(threading.active_count())
print(threading.current_thread())
print(threading.enumerate()) threading.Condition
con = Condition() # 条件 # 一个条件被创建之初 默认有一个False状态 # False状态 会影响wait一直处于等待状态
con.acquire()
con.wait() # 等钥匙
con.notify(num) # 造钥匙
con.release()
# 用完即销毁,notify(数量),条件状态设置为notify(数量)个True,wait()通过一次,就减少一个True threading.Timer # 定时器
t = Timer(5,func).start() # 非阻塞的
# 只是延时执行func函数,异步开启线程
import queue
q = queue.Queue() # 队列 先进先出
q = queue.LifoQueue() # 栈 先进后出
q = queue.PriorityQueue()
q.put((20,'a'))
# 优先级队列,第一个元组元素是优先级,数字越小越优先,优先级相同,消息按ascll排序
# concurrent.futures 线程池和进程池
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
pool = ThreadPoolExecutor(max_workers=5) # 设置进程池中的进程个数
pool.map(func,range(20)) # == for i in range(20):submit(func,i)
# 拿不到返回值,参数 *iterables
p = pool.submit(func,i)
# 返回对象,p.result()取值 添加回调函数 .add_done_callback(call_back) ,回调函数接收参数p对象,用p.result()取值
pool.shutdown() # close+join from gevent import monkey;monkey.patch_all()
import gevent # 协程 本质上是一个线程 # print(threading.current_thread().getName()) # 虚拟线程
g1 = gevent.spawn(eat)
g2 = gevent.spawn(play)
g1.join()
g2.join() # gevent.joinall(g_lst) # for g in g_lst:g.join()
# 进程和线程的任务切换右操作系统完成
# 协程任务之间的切换由程序(代码)完成,只有遇到协程模块能识别的IO操作的时候,程序才会进行任务切换,实现并发的效果
多进程 multiprocessing 多线程Threading 线程池和进程池concurrent.futures的更多相关文章
- Python并发复习4- concurrent.futures模块(线程池和进程池)
Python标准库为我们提供了threading(多线程模块)和multiprocessing(多进程模块).从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提 ...
- python-----多线程、线程池、进程池
import threadingimport time ###############################多线程################################------ ...
- GIL全局解释器锁,线程池与进程池 同步异步,阻塞与非阻塞,异步回调
GIL全局解释器锁 1.什么是GIL 官方解释:'''In CPython, the global interpreter lock, or GIL, is a mutex that prevents ...
- Python线程池与进程池
Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...
- day 7-7 线程池与进程池
一. 进程池与线程池 在刚开始学多进程或多线程时,我们迫不及待地基于多进程或多线程实现并发的套接字通信,然而这种实现方式的致命缺陷是:服务的开启的进程数或线程数都会随着并发的客户端数目地增多而增多,这 ...
- python之线程池和进程池
线程池和进程池 一.池的概念 池是用来保证计算机硬件安全的情况下最大限度的利用计算机 它降低了程序的运行效率但是保证了计算机硬件的安全从而让你写的程序能够正常运行 ''' 无论是开设进程也好还是开设线 ...
- 协程与concurent.furtrue实现线程池与进程池
1concurent.furtrue实现线程池与进程池 2协程 1concurent.furtrue实现线程池与进程池 实现进程池 #进程池 from concurrent.futures impor ...
- 使用concurrent.futures模块中的线程池与进程池
使用concurrent.futures模块中的线程池与进程池 线程池与进程池 以线程池举例,系统使用多线程方式运行时,会产生大量的线程创建与销毁,创建与销毁必定会带来一定的消耗,甚至导致系统资源的崩 ...
- 内存池、进程池、线程池介绍及线程池C++实现
本文转载于:https://blog.csdn.net/ywcpig/article/details/52557080 内存池 平常我们使用new.malloc在堆区申请一块内存,但由于每次申请的内存 ...
随机推荐
- storm maven-shade-plugin
storm-core pom <plugin> <groupId>org.apache.maven.plugins</groupId> <artifact ...
- 熔断 降级(polly)
熔断 降级(polly) https://www.cnblogs.com/szlblog/p/9300845.html1.熔断降级的概念: 熔断:我这里有一根长度一米的钢铁,钢铁的熔点1000度(假设 ...
- (转)Module ngx_http_fastcgi_module
Example ConfigurationDirectives fastcgi_bind fastcgi_buffer_size fastcgi_buffering f ...
- 搭建本地SVN資料
基于網上眾多教程,搭建SVN成功:VisualSVN Server + TortoiseSVN Client. 過程比較簡單,就不重複書寫了. 部份參考資料,感謝作者: 什麽是SVN及如何應用 htt ...
- Android使用AchartEngine绘制曲线图
1.在布局文件中加入LinearLayout布局,如下: <LinearLayout android:id="@+id/chart" android:orientation= ...
- 【Unity3D】3D游戏学习
1.理解游戏元素,简单回答以下问题: 1.1简单介绍一款上世纪(19XX)出品的计算机游戏,然后按课件的方法描述游戏的五个基本元素.(讲目标.玩法.规则) 1.1.1仙剑奇侠传 <仙剑奇侠传&g ...
- Godaddy虚拟主机新建mysql数据库 2019最新
第一次用狗爹,完全摸不着路子. 网站本地已搭建,不知道数据库是在哪里上传. 百度搜索结果都是四五年前的旧内容,耽误时间. 还是问客服,Godaddy的客服确实不赖 godaddy虚拟主机如何新建数据库 ...
- 【extjs6学习笔记】Mastering Ext JS, 2nd Edition
我不知道在别人看来,我是什么样的人:但在我自己看来,我不过就象是一个在海滨玩耍的小孩,为不时发现比寻常更为光滑的一块卵石或比寻常更为美丽的一片贝壳而沾沾自喜,而对于展现在我面前的浩瀚的真理的海洋,却全 ...
- 由Cocos2d-x工程入口窥见代理模式
关于设计模式(Design Pattern),自从“四人帮”第一次在<Design Patterns: Elements of Reusable Object-Oriented Software ...
- 转:error LNK2005: ...already defined in MSVCRTD.lib
编译错误: Error1error LNK2005: _CrtSetCheckCount already defined in MSVCRTD.lib(MSVCR110D.dll)\libcmtd.l ...