concurrent.futures

concurrent.futures提供高层次的接口,用来实现异步调用。

这个异步执行可以使用threads(ThreadPoolExecutor)或者process(ProcessPoolExecutor)

这个feautre是Python3.2后的新功能,但是也支持Python2。

需要安装futures模块,https://pypi.python.org/pypi/futures/2.1.4

【例子1】非并发的例子

#!/usr/bin/env python2.6

from Queue import Queue
import random
import time q = Queue()
fred = [1,2,3,4,5,6,7,8,9,10] def f(x):
if random.randint(0,1):
time.sleep(0.1)
#
res = x * x
q.put(res) def main():
for num in fred:
f(num)
#
while not q.empty():
print q.get() if __name__ == "__main__":
main()

  

【例子2】使用ThreadPoolExecutor

#!/usr/bin/env python2.7                                                                                                     

from Queue import Queue
import concurrent.futures
import random
import time q = Queue()
fred = [1,2,3,4,5,6,7,8,9,10] def f(x):
if random.randint(0,1):
time.sleep(0.1)
#
res = x * x
q.put(res) def main():
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
for num in fred:
executor.submit(f, num)
#
while not q.empty():
print q.get() #################### if __name__ == "__main__":
main()

使用线程池中4个workers处理所有job。

with的语句保证所有线程都执行完成后,再进行下面的操作。

结果保持在一个队列中,队列是线程安全的。

. “The Queue module implements multi-producer, multi-consumer queues. It is especially useful in threaded programming when information must be exchanged safely between multiple threads. The Queue class in this module implements all the required locking semantics.

队列模块实现多个生产者,多个消费者模式。特别在多线程之间进行信息交换的场景下最长使用。在这个模块下Queue类实现了所有需要的锁信息。

【例子3】使用ProcessPoolExecutor

The ProcessPoolExecutor class is an Executor subclass that uses a pool of processes to execute calls asynchronously. ProcessPoolExecutor uses the multiprocessing module, which allows it to side-step the Global Interpreter Lock but also means that only picklable objects can be executed and returned.

ProcessPoolExecute是Executor的子类,使用进程池实现异步调用。ProcessPoolExecute使用多进程模块,允许规避 Global Interpreter Lock,但是只有处理和返回picklable的对象。

#!/usr/bin/env python2.7

import sys
import redis
import concurrent.futures r = redis.Redis()
fred = [1,2,3,4,5,6,7,8,9,10] def check_server():
try:
r.info()
except redis.exceptions.ConnectionError:
print >>sys.stderr, "Error: cannot connect to redis server. Is the server running?"
sys.exit(1) def f(x):
res = x * x
r.rpush("test", res) def main():
with concurrent.futures.ProcessPoolExecutor(max_workers=4) as executor:
for num in fred:
executor.submit(f, num)
#
print r.lrange("test", 0, -1) #################### if __name__ == "__main__":
check_server()
###
r.delete("test")
main()

使用到redis链表的数据结构

Queue is not a good choice here because we are using processes here, and Queue is made for threads.

Queue不是一个好的选择,因为这里使用process。Queue是为线程准备的。

所以这里将结果存储在redis的list中,redis: getting started

在redis中所有的操作都是原子的,因此对于不同的进程可以安全写入相关的结果。

【测试】

1、把源数据设置为range(1,1000)之后,测试效果如下:

[root@typhoeus79 20140811]# time ./basic.py 

real    0m49.388s
user 0m0.024s
sys 0m0.013s
[root@typhoeus79 20140811]# time ./thread.py real 0m12.687s
user 0m0.103s
sys 0m0.061s
[root@typhoeus79 20140811]# time ./process.py real 0m0.507s
user 0m0.557s
sys 0m0.343s

  

【适应场景】

Threads are good for I/O tasks, while processes are good for CPU-bound tasks.

【Executor】

 class concurrent.futures.Executor

    An abstract class that provides methods to execute calls asynchronously. It should not be used directly, but through its concrete subclasses

Executor是一个抽象的类,提供执行异步调用的方法。不能直接调用,而是通过具体的子类来调用。

ThreadPoolExecutor和ProcessPoolExecutor都是其的子类。

 submit(fn, *args, **kwargs)

Schedules the callable, fn, to be executed as fn(*args **kwargs) and returns a Future object representing the execution of the callable.

执行函数fn(*args,**kwargs),返回一个Future对象,代表可调用的执行。

>>> with ThreadPoolExecutor(max_workers=1) as executor:
... future = executor.submit(pow, 323, 1235)
... print(future)
...
<Future at 0x7f1e7d053e10 state=finished returned long>

#打印结果
>>> with ThreadPoolExecutor(max_workers=1) as executor:
... future = executor.submit(pow, 323, 1235)
... print(future.result())
map(func, *iterables, timeout=None)

    Equivalent to map(func, *iterables) except func is executed asynchronously and several calls to func may be made concurrently. The returned iterator raises a TimeoutError if __next__() is called and the result isn’t available after timeout seconds from the original call to Executor.map(). timeout can be an int or a float. If timeout is not specified or None, there is no limit to the wait time. If a call raises an exception, then that exception will be raised when its value is retrieved from the iterator.

并发执行func,参数为iterables指定。timeout可以指定为int或者float类型,如果没有指定或者None,则无限等待。如果触发异常,当从iterator获取值的时候,这个异常将被捕获。

 shutdown(wait=True)

    Signal the executor that it should free any resources that it is using when the currently pending futures are done executing. Calls to Executor.submit() and Executor.map() made after shutdown will raise RuntimeError.

 释放资源使用。

使用with语句,避免该函数的调用,with语句会关闭所有的Executor。

>>> with ThreadPoolExecutor(max_workers=4) as e:
... e.submit(shutil.copy, 'src1.txt', 'dest1.txt')
... e.submit(shutil.copy, 'src2.txt', 'dest2.txt')
... e.submit(shutil.copy, 'src3.txt', 'dest3.txt')
... e.submit(shutil.copy, 'src3.txt', 'dest4.txt')
...
<Future at 0x7f1e79191250 state=running>
<Future at 0x7f1e79191450 state=finished raised IOError>
<Future at 0x7f1e79191250 state=running>
<Future at 0x7f1e79191450 state=finished raised IOError>

【参考文献】

1、https://pythonadventures.wordpress.com/tag/threadpoolexecutor/

2、https://docs.python.org/dev/library/concurrent.futures.html#module-concurrent.futures

concurrent.futures的更多相关文章

  1. Python标准模块--concurrent.futures

    1 模块简介 concurrent.futures模块是在Python3.2中添加的.根据Python的官方文档,concurrent.futures模块提供给开发者一个执行异步调用的高级接口.con ...

  2. 在python中使用concurrent.futures实现进程池和线程池

    #!/usr/bin/env python # -*- coding: utf-8 -*- import concurrent.futures import time number_list = [1 ...

  3. python简单粗暴多进程之concurrent.futures

    python在前面写过多线程的库threading: python3多线程趣味详解 但是今天发现一个封装得更加简单暴力的多进程库concurrent.futures: # !/usr/bin/pyth ...

  4. 45、concurrent.futures模块与协程

    concurrent.futures  —Launching parallel tasks    concurrent.futures模块同时提供了进程池和线程池,它是将来的使用趋势,同样我们之前学习 ...

  5. python concurrent.futures

    python因为其全局解释器锁GIL而无法通过线程实现真正的平行计算.这个论断我们不展开,但是有个概念我们要说明,IO密集型 vs. 计算密集型. IO密集型:读取文件,读取网络套接字频繁. 计算密集 ...

  6. 进程池与线程池(concurrent.futures)

    from concurrent.futures import ProcessPoolExecutor import os,time,random def task(n): print('%s is r ...

  7. python异步并发模块concurrent.futures入门详解

    concurrent.futures是一个非常简单易用的库,主要用来实现多线程和多进程的异步并发. 本文主要对concurrent.futures库相关模块进行详解,并分别提供了详细的示例demo. ...

  8. Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures

    参考博客: https://www.cnblogs.com/xiao987334176/p/9046028.html 线程简述 什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线 ...

  9. 线程池、进程池(concurrent.futures模块)和协程

    一.线程池 1.concurrent.futures模块 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 Pro ...

随机推荐

  1. ubuntu环境下lnmp环境搭建(1)之Mysql

    1. vm下安装Ubuntu 1)下载镜像ubuntu-15.04-desktop-amd64.iso http://yunpan.cn/cF5dwV6zw33ef 访问密码 ecba(个人分享在36 ...

  2. 从源码看 angular/material2 中 dialog模块 的实现

    本文将探讨material2中popup弹窗即其Dialog模块的实现. 使用方法 引入弹窗模块 自己准备作为模板的弹窗内容组件 在需要使用的组件内注入 MatDialog 服务 调用 open 方法 ...

  3. Spring MVC Ajax 复杂参数的批量传递

    要解决的问题: 如何组织客户端参数? Ajax 方法的配置属性如何定义才能传递复杂参数? 基于 SpringMVC 的服务端该如何接收? MyBatis 怎么处理批量更新? 客户端脚本 viewMes ...

  4. OpenGL ES2.0贴图

    1.定义传入着色器的顶点数据及索引 //传入结构体 typedef struct { ]; ]; } Vertex; //顶点数据 const Vertex Vertices[] = { {{, -, ...

  5. nginx的反向代理功能和缓存功能

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  6. java内部类demo

    内部类主要有三种:静态内部类,实例内部类,局部变量内部类 1.静态内部类,该类被static修饰,并且是成员变量,它只能访问外部类被static修饰的方法以及字段(这种说法只局限于不再内部类中创建外部 ...

  7. Developing Universal Windows Apps 开发UWA应用 问答

    开始是一些欢迎,就不翻译 Question: Is the code already there? Answer: There is some code on that codeplex site, ...

  8. 无限大地图:lightmap拆分

    无缝地图涉及到地形.物件的分块加载,同样,lightmap也需要动态加载.而场景烘焙时,所有物件都是一起烘焙的,那怎么把某些物件指定烘焙到某一张lightmap贴图中?网上找了很久,也没有看到具体的实 ...

  9. jemalloc 快速上手攻略

    引言 - 赠送个 Cygwin (加精) Cygwin 有它存在的合理性. 至少比 wine 好太多了. 它主要功能是在winds上面简易的模拟出linux环境, 比虚拟机 轻量一点点. 坑也不少, ...

  10. ~.NET下国际化i18n简单示例

    因业务需要,后台站点需要出一个国际化的解决方案,偷懒后用微软自带资源文件暂时解决.废话不多说,进入正题. 第一步:在项目菜单下选择添加国际化资源文件夹. 第二部:添加完毕之后,添加各语言版本下的资源信 ...