第一次接触futures这个库是在tornado中,4.0的tornado会经常的使用他,因为tornado本身的那个corouting的异步功能,是需要逻辑里面所调用的模块本身就支持异步才可以的。而且如果用futures之后,在一定程度上缓解了这个事情。 

concurrent.futures 是python3新增加的一个库,用于并发处理,类似于其他语言里的线程池(也有一个进程池),他属于上层的封装,对于用户来说,不用在考虑那么多东西了。 

逼不得已,注释下我的博客地址   blog.xiaorui.cc

这里主要有:
Executor:还有它的两个子类ThreadPoolExecutor和ProcessPoolExecutor
Future:有Executor.submit产生多任务

那先看下THreadPoolExecutor

接着看下ProcessPoolExecutor,会发现他的用法相当的简练,不再像以前threading、multiprocessing那样繁琐。 


Executor is an abstract class that provides methods to execute calls asynchronously. It should not be used directly, but through its two subclasses: ThreadPoolExecutor and ProcessPoolExecutor.
官方的介绍直白,用submit注册你的函数,以及要传递的相关的参数。 
Executor.submit(fn, *args, **kwargs)
Schedules the callable to be executed as fn*(*args*, **kwargs) and returns a Future representing the execution of the callable.

with ThreadPoolExecutor(max_workers=1) as executor:
    future = executor.submit(pow, 323, 1235)
    print(future.result())

那下面这个shutdown就有些kill了。你可以自己判断,或者是直接干掉他。 
Executor.shutdown(wait=True)


注意一点:

    看到官方提供的一个例子,是一个死锁的例子,大家在用future进行开发时,要避免一定的程度的互相引用。话说,这个有些像gevent的event result,在一个函数中等待另一个结果的完毕。

如果上面的任务,一定要同时进行的话,可以开出两个任务,中间用全局变量或者xxx。

下面的任务也照样会造成死锁的状态,最好不要在已经被submit的函数里面在调用submit。因为这好比你在threading里面再threading一定,是无效的。

好了,上面总是说使用python future遇到的坑,官网的例子使用模块是python3的,我已改成python2支持的。 


除此之外,也来看看futures的其他的对象。


很明显这个是增加函数的回调方法,那add_done_calback和咱们平时传入func做回调有啥区别,add_done_callback不仅可以后续的增加,而且就算你把Executor的任务给cancel取消,还是会帮你做些回调的处理,感觉一定是用装饰器搞的,有时间分析下他的源码。 
Future.add_done_callback(fn)

那到现在为止,关于python的current.futures这个异步库,已经介绍完了,具体详细的大家还是看源码吧。 我相信这个也是坑逼无数的东西。



对Python及运维开发感兴趣的朋友可以加QQ群 : 478476595 !!!
{ 2000人qq大群内有各厂大牛,常组织线上分享及沙龙,对高性能及分布式场景感兴趣同学欢迎加入该QQ群 }

另外如果大家觉得文章对你有些作用!   帮忙点击广告. 一来能刺激我写博客的欲望,二来好维护云主机的费用.
如果想赏钱,可以用微信扫描下面的二维码. 另外再次标注博客原地址  xiaorui.cc  ……   感谢!
暂无相关产品

1则回应给“使用python的并发库concurrent.futures实现异步”

  1. 网友517240693说道:

    看博主的文章学到了很多,谢谢

发表评论