当前位置: 首页 > news >正文

python 之 进程池与线程池

1.什么时候用池?

    池的功能是限制启动的进程数或线程数。

   什么时候应该限制?

   当并发的任务数远远超过了计算机的承受能力时,即无法一次性开启过多的进程数或线程数时

就应该用池的概念将开启的进程数或线程数限制在计算机可承受的范围内


2.同步 vs 异步

同步,异步指的是提交任务的两种方式

同步:提交完任务后就在原地等待,直到任务运行完毕后拿到任务的返回值,再继续运行下一行代码

异步:提交完任务(绑定一个回调函数)后根本就不在原地等待,直接运行下一行代码,等到任务有返回值后会自动触发回调函数。



进程池:

# from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
# import os
# import time
# import random
#
# def task(n):
# print('%s run...' %os.getpid())
# time.sleep(5)
# return n**2
#
# def parse(future):
# time.sleep(1)
# res=future.result()
# print('%s 处理了 %s' %(os.getpid(),res))
#
# if __name__ == '__main__':
# pool=ProcessPoolExecutor(4)
# # pool.submit(task,1)
# # pool.submit(task,2)
# # pool.submit(task,3)
# # pool.submit(task,4)
#
# start=time.time()
# for i in range(1,5):
# future=pool.submit(task,i)
# future.add_done_callback(parse) # parse会在futrue有返回值时立刻触发,并且将future当作参数传给parse
# pool.shutdown(wait=True)
# stop=time.time()
# print('主',os.getpid(),(stop - start))




线程池:


from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor
from threading import current_thread
import os
import time
import random

def task(n):
print('%s run...' %current_thread().name)
time.sleep(5)
return n**2

def parse(future):
time.sleep(1)
res=future.result()
print('%s 处理了 %s' %(current_thread().name,res))

if __name__ == '__main__':
pool=ThreadPoolExecutor(4)
start=time.time()
for i in range(1,5):
future=pool.submit(task,i)
future.add_done_callback(parse) # parse会在futrue有返回值时立刻触发,并且将future当作参数传给parse
pool.shutdown(wait=True)
stop=time.time()
print('主',current_thread().name,(stop - start))











转载于:https://www.cnblogs.com/fxc-520520/p/9322580.html

相关文章:

  • 经典正则表达式 (收藏整理)
  • 前端工程师最好的全栈开发实践-设计开发属于自己的nodejs博客
  • eclipse创建android项目出现error libz.so.1: cannot open shared object file:No such file or directory...
  • 回溯法----背包问题
  • FTP攻略
  • __dopostback的用法
  • 保证应用程序只有一个实例运行
  • 活动目录系列之三:多域环境的实现(单站点)
  • linux添加开机自启动脚本示例详解
  • Web内容管理系统 Magnolia
  • CentOS6.4下Mysql数据库的安装与配置
  • 委托与事件的练习
  • 1-shell教程
  • 点击空白处键盘hide
  • 学习打卡-2018/07/19
  • Brief introduction of how to 'Call, Apply and Bind'
  • canvas 高仿 Apple Watch 表盘
  • Cumulo 的 ClojureScript 模块已经成型
  • Fabric架构演变之路
  • JS函数式编程 数组部分风格 ES6版
  • Linux中的硬链接与软链接
  • Nacos系列:Nacos的Java SDK使用
  • spring security oauth2 password授权模式
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • vue脚手架vue-cli
  • vue数据传递--我有特殊的实现技巧
  • WebSocket使用
  • 分布式事物理论与实践
  • 那些年我们用过的显示性能指标
  • 你真的知道 == 和 equals 的区别吗?
  • 普通函数和构造函数的区别
  • 前端自动化解决方案
  • 思维导图—你不知道的JavaScript中卷
  • 追踪解析 FutureTask 源码
  • 你对linux中grep命令知道多少?
  • (16)Reactor的测试——响应式Spring的道法术器
  • (20050108)又读《平凡的世界》
  • (C语言)字符分类函数
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (八十八)VFL语言初步 - 实现布局
  • (五)网络优化与超参数选择--九五小庞
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .Net IOC框架入门之一 Unity
  • .Net Web窗口页属性
  • .net 发送邮件
  • .Net中的设计模式——Factory Method模式
  • @Data注解的作用
  • @property python知乎_Python3基础之:property
  • @RestControllerAdvice异常统一处理类失效原因
  • [boost]使用boost::function和boost::bind产生的down机一例
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [CF494C]Helping People