concurrent模块的使用
Posted marklijian
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了concurrent模块的使用相关的知识,希望对你有一定的参考价值。
concurrent模块
进程池和线程池
池的功能限制进程数或线程数.
当需要并发的进程或线程太多,远大于操作所能承受的最大数量时,
使用线程池或进程池控制程序产生的进程数或线程数,来防止操作系统受到太大的压力从而导致服务器宕机
下面两个模块都是在concurrent文件夹中的futures文件夹下的py文件
from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor
进程池
from concurrent.futures import ProcessPoolExecutor
import time
def run():
print(123)
time.sleep(0.5)
print(234)
return "我是最终结果"
def call_back(future):
print(future.result())
if __name__ == '__main__':
pool = ProcessPoolExecutor(3)
for i in range(10):
future = pool.submit(run)
future.add_done_callback(call_back)
pool.shutdown()
print("用了shutdown以后我最后在打印")
ProcessPoolExecutor
pool = ProcessPoolExecutor(n)
- 开启进程池,设置进程池里进程的个数为n
future = pool.submit(task,i)
- 将任务放到进程池中
- task——任务名
- i——任务参数
- future——生成的任务对象
pool.shutdown()
- 等待进程池中的所有任务都完成在执行代码
future.result()
- 获得任务的返回值
- 注意,使用这个方法,会阻塞住线程池任务的执行,使任务都变成串行
- 解决方案
- 使用列表每个任务的对象保存起来,
最后再从列表中统一取出返回值 - future.add_done_callback(parse)
- 回调函数
- 当对象线程结束时候,会自动回调parse这个函数执行
- 使用列表每个任务的对象保存起来,
线程池
from concurrent.futures import ThreadPoolExecutor
import time
def run():
print(123)
time.sleep(4)
print(234)
def call_back(future):
print(future.result())
if __name__ == '__main__':
pool = ThreadPoolExecutor(3)
for i in range(10):
future = pool.submit(run)
future.add_done_callback(call_back)
pool.shutdown()
print("用了shutdown以后我最后在打印")
ThreadPoolExecutor
pool = ThreadPoolExecutor(n)
- 开启线程池,设置线程池里线程的个数为n
future = pool.submit(task,i)
- 将任务放到线程池中
- task——任务名
- i——任务参数
- future——生成的任务对象
pool.shutdown()
- 等待进程池中的所有任务都完成,再执行代码
future.result()
- 获得任务的返回值
- 注意,使用这个方法,会阻塞住线程池任务的执行,使任务都变成串行
- 解决方案
- 使用列表每个任务的对象保存起来,
最后再从列表中统一取出返回值 - future.add_done_callback(parse)
- 回调函数
- 当对象线程结束时候,会自动回调parse这个函数执行
- 使用列表每个任务的对象保存起来,
同步、异步、阻塞和非阻塞
同步
- 就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回
异步
- 当一个异步过程调用发出后,调用者不能立刻得到结果。
- 实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。
阻塞
- 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。
非阻塞
- 指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
XMind: ZEN - Trial Version
以上是关于concurrent模块的使用的主要内容,如果未能解决你的问题,请参考以下文章
使用concurrent.futures模块并发,实现进程池线程池
Python程序中的线程操作(线程池)-concurrent模块