本文简单介绍python进程模块multiprocessing提供的进程池和线程池功能。

进程池:

进程池的使用有四种方式:apply_async、apply、map_async、map。其中apply_async和map_async是异步的,也就是启动进程函数之后会继续执行后续的代码不用等待进程函数返回。apply_async和map_async方式提供了一写获取进程函数状态的函数: ready()successful()get()。
PS:join()语句要放在close()语句后面。

实例代码如下:
# -*- coding: utf-8 -*-

import multiprocessing
import timedef func(msg):print('msg: ', msg)time.sleep(1)print('********')return 'func_return: %s' % msgif __name__ == '__main__':# apply_async
    print('\n--------apply_async------------')pool = multiprocessing.Pool(processes=4)results = []for i in range(10):msg = 'hello world %d' % iresult = pool.apply_async(func, (msg, ))results.append(result)print('apply_async: 不堵塞')for i in results:i.wait()  # 等待进程函数执行完毕

    for i in results:if i.ready():  # 进程函数是否已经启动了
            if i.successful():  # 进程函数是否执行成功
                print(i.get())  # 进程函数返回值

    # apply
    print('\n--------apply------------')pool = multiprocessing.Pool(processes=4)results = []for i in range(10):msg = 'hello world %d' % iresult = pool.apply(func, (msg,))results.append(result)print('apply: 堵塞')  # 执行完func才执行该句
    pool.close()pool.join()  # join语句要放在close之后
    print(results)# map
    print('\n--------map------------')args = [1, 2, 4, 5, 7, 8]pool = multiprocessing.Pool(processes=5)return_data = pool.map(func, args)print('堵塞')  # 执行完func才执行该句
    pool.close()pool.join()  # join语句要放在close之后
    print(return_data)# map_async
    print('\n--------map_async------------')pool = multiprocessing.Pool(processes=5)result = pool.map_async(func, args)print('ready: ', result.ready())print('不堵塞')result.wait()  # 等待所有进程函数执行完毕

    if result.ready():  # 进程函数是否已经启动了
        if result.successful():  # 进程函数是否执行成功
            print(result.get())  # 进程函数返回值

线程池:

线程池的使用方式和进程池类似。
实例代码如下:
# -*- coding: utf-8 -*-

from multiprocessing.dummy import Pool as ThreadPool
import timedef fun(msg):print('msg: ', msg)time.sleep(1)print('********')return 'fun_return %s' % msg# map_async
print('\n------map_async-------')
arg = [1, 2, 10, 11, 18]
async_pool = ThreadPool(processes=4)
result = async_pool.map_async(fun, arg)
print(result.ready())  # 线程函数是否已经启动了
print('map_async: 不堵塞')
result.wait()  # 等待所有线程函数执行完毕
print('after wait')
if result.ready():  # 线程函数是否已经启动了
    if result.successful():  # 线程函数是否执行成功
        print(result.get())  # 线程函数返回值

# map
print('\n------map-------')
arg = [3, 5, 11, 19, 12]
pool = ThreadPool(processes=3)
return_list = pool.map(fun, arg)
print('map: 堵塞')
pool.close()
pool.join()
print(return_list)# apply_async
print('\n------apply_async-------')
async_pool = ThreadPool(processes=4)
results =[]
for i in range(5):msg = 'msg: %d' % iresult = async_pool.apply_async(fun, (msg, ))results.append(result)print('apply_async: 不堵塞')
# async_pool.close()
# async_pool.join()
for i in results:i.wait()  # 等待线程函数执行完毕

for i in results:if i.ready():  # 线程函数是否已经启动了
        if i.successful():  # 线程函数是否执行成功
            print(i.get())  # 线程函数返回值

# apply
print('\n------apply-------')
pool = ThreadPool(processes=4)
results =[]
for i in range(5):msg = 'msg: %d' % iresult = pool.apply(fun, (msg, ))results.append(result)print('apply: 堵塞')
print(results)

python进程池multiprocessing.Pool和线程池multiprocessing.dummy.Pool实例相关推荐

  1. 在Python网络爬虫程序中使用线程池

    在Python网络爬虫程序中使用线程池 一.为什么需要使用线程池 二.线程池的使用 2.1 线程池的类与方法 2.2 使用线程池的一般步骤 三.在爬虫程序中使用线程池的实例 一.为什么需要使用线程池 ...

  2. python 线程池回收_python实现线程池

    这段时间一直在做一个爬虫系统,用python和django实现.其中涉及到了多线程的问题,在后端使用一个全局的字典用来保存和识别已经运行的线程.但是觉得这样的实现不是不太舒服.于是想找到一个更好的实现 ...

  3. springboot 线程池_Spring boot 2 线程池怎么配置

    线程池 在java 中线程池,就是ThreadPoolExecutor来构造,简单看下线程池包含的方法, corePoolSize:初始化线程.线程池中保留的线程数量. maximumPoolSize ...

  4. 【Android 异步操作】线程池 ( 线程池使用示例 | 自定义线程池使用流程 | 自定义任务拒绝处理策略 | 完整代码示例 )

    文章目录 一.自定义线程池使用流程 二.自定义任务拒绝处理策略 三.完整代码示例 在博客 [Android 异步操作]线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTas ...

  5. 【Android 异步操作】线程池 ( 线程池简介 | 线程池初始化方法 | 线程池种类 | AsyncTask 使用线程池示例 )

    文章目录 一.线程池简介 二.线程池初始化方法简介 三.线程池使用示例 一.线程池简介 线程池一般是实现了 ExecutorService 接口的类 , 一般使用 ThreadPoolExecutor ...

  6. java线程池_Java 并发编程 线程池源码实战

    作者 | 马启航 杏仁后端工程师.「我头发还多,你们呢?」 一.概述 笔者在网上看了好多的关于线程池原理.源码分析相关的文章,但是说实话,没有一篇让我觉得读完之后豁然开朗,完完全全的明白线程池,要么写 ...

  7. java 队列线程池_JAVA工作队列与线程池

    为什么要使用线程池? 诸如 Web 服务器.数据库服务器.文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务.请求以某种方式到达服务器,这种方式可能是通过网络协议 ...

  8. 什么是线程池和常用的线程池

            创建线程要花费昂贵的资源和时间,如果任务来了才创建线程那么响应时间会变长,而且一个进程能创建的线程数有限.为了避免这些问题,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池, ...

  9. 一文详解java线程池 详解Java线程池的七个参数 详解池化技术 java如何选择核心线程数 详解Java线程池的拒绝策略

    目录 引言 线程池使用场景 加快请求响应(响应时间优先) 加快处理大任务(吞吐量优先) 特殊说明 线程池的池化技术 线程池的创建 手动创建 创建newFixedThreadPool线程池 创建newS ...

  10. Android性能优化之线程池策略和对线程池的了解

    转载于 http://blog.csdn.net/roshen_android/article/details/52948480 线程的运行机制 1. 开启线程过多,会消耗cpu 2. 单核cpu,同 ...

最新文章

  1. 七夕福利 | 拒绝狗粮,给你全部的AI(爱)
  2. 开源sip客户端 linux,开源SIP服务器 Kamailio
  3. 1,windows java环境搭建,eclipse安装、tomcat配置,快速创建jsp页面
  4. mysql字段作用_mysql用户表host字段作用
  5. 用java写一个if语句
  6. jenkins使用插件OWASP Dependency-Check Plugin对jar包漏洞扫描
  7. apache部署mo_python
  8. Atitit postgresql data type 数据类型与mysql对应表 数据库常用数据类型 Postgre Mysql 整数 intgreter Int 小数 numeric FL
  9. Spring源码深度解析百度网盘下载
  10. INT 10H显示字符串的小例子
  11. CSS3的clac()函数无效,警告提示“invalid property value”
  12. ERP电商管理系统开发实现功能
  13. javascript中ready和onload的理解
  14. raspios-bullseye-arm64 系统 BUG
  15. 那些年我们遇到的坑(3)-basePackages和scanBasePackages
  16. 云时代下,传统和新型存储的博弈已经开始
  17. 2015湘潭邀请赛 Yada Number
  18. 魔法女孩交到了好朋友(变量)
  19. 常用搜索引擎 (转)
  20. 实际开发中,TCP / IP五层网络模型是如何工作的?

热门文章

  1. stemwin 实现显示屏幕滑动
  2. 装了oracle 开机卡黑屏,开机黑屏进不了系统,手把手教你解决电脑开机黑屏进不了系统...
  3. 查看表空间使用率(包括临时表空间)
  4. 区块链热点!STO被政府严令禁止
  5. hdu5148 树形dp,分组背包
  6. Java中的请求域(Request)《笔记》
  7. 数据结构(C语言)——线性表(定义,基本操作)
  8. Ubuntu 20.04 日常软件及开发环境安装命令,包括QQ、搜狗、Chrome、vlc、网易云音乐安装方法(待整理!!!)
  9. Matlab:绘制不同颜色的柱状图bar
  10. STM32基础之中断--外部中断