文档章节

Python学习-并发编程之线程池

D7
 D7
发布于 2017/08/31 20:00
字数 611
阅读 17
收藏 0

Python学习-并发编程之线程池

利用concurrent.futures模块创建线程池

ThreadPoolExecutor类概述

class ThreadPoolExecutor(_base.Executor):
  	def __init__(self, max_workers=None):
      	'''max_workers线程池中最大线程数'''
      	pass
  
  	def submit(self, fn, *args, **kwargs):
      	'''
      	向线程池中提交线程,默认是异步的,
      	fn:线程处理的对象,函数的地址,
      	*args:以位置传参的方式给处理对象传递参数,
      	**kwargs:以关键字传参的方式给对象传递参数,
      	返回一个Future类型的对象。
      	'''
    	pass
    
    def map(self, fn, *iterables, timeout=None, chunksize=1):
      	'''
      	向线程池中提交一个类似如map()函数功能的进程
      	fn:进程处理的对象,函数的地址,
      	*iterables:传递一个可迭代的对象,
      	map()方法返回值为一个迭代器。
      	'''
    	pass
    
    def shutdown(self, wait=True):
      	'''关闭线程池'''
      	pass

ThreadPoolExecutorr类创建线程池的方法

# 用ThreadPoolExecutor类创建的线程池默认都是异步的
import os,time,random
from concurrent.futures import  ThreadPoolExecutor

def Calculation(value, count):		# 创建一个处理函数
    if value == 1:
        print("pid:%s count:%d" %((os.getpid(), count)))
        return count
    if value % 2 == 0:
        count += 1
        value = value / 2
        time.sleep(1)				# 模拟执行时间
    else:
        value = value * 3 + 1
    return Calculation(value, count)

if __name__ == '__main__':
  	# ThreadPoolExecutor类支持with上下文管理,因此可以省略shutdown()方法
    with ThreadPoolExecutor(4) as T_Pool:
        T_List = []
        count = 0
        for i in range(10):
            ret = T_Pool.submit(Calculation, random.randint(i+1, i+10), count)
            # 如果想实现同步线程池,可用下述方法,返回的就直接就是线程的执行结果
            # ret = T_Pool.submit(Calculation, random.randint(i+1, i+10), count).result()
            T_List.append(ret)
    # 同Pool类获取返回值的方法不同,这里使用result()方法,而不是get()方法
    print([ret.result() for ret in T_List])

ThreadPoolExecutor实现线程池的回调函数

from concurrent.futures import ThreadPoolExecutor
import os,requests

def get_page(url):				# 定义一个获取网页的函数
    print('<进程%s> get %s' %(os.getpid(), url))
    respone = requests.get(url)		# 获取网页
    if respone.status_code == 200:	# 查看获取状态
        return {'url':url,'text':respone.text}	# 返回获取的内容

def pasrse_page(res):		# 定义处理网页的函数
    res = res.result()      # 注意:此时接受的res是Future类型的对象,通过result() 方法拿到值
    print('<进程%s> parse %s' %(os.getpid(), res['url']))
    parse_res = 'url:<%s> size:[%s]\n' %(res['url'], len(res['text']))
    with open('db.txt','a') as f:
        f.write(parse_res)		# 保存至文件

if __name__ == '__main__':

    urls=[
        'https://www.baidu.com',
        'https://www.python.org',
        'https://www.openstack.org',
        'https://help.github.com/',
        'http://www.sina.com.cn/'
    ]

    with ThreadPoolExecutor(4) as T_Pool:
        T_List = []
        for url in urls:
            # 注意:add_done_callback()方法接受线程返回的Future类型的对象,而不线程的结果值
            res = T_Pool.submit(get_page, url).add_done_callback(pasrse_page)
            T_List.append(res)

© 著作权归作者所有

共有 人打赏支持
D7

D7

粉丝 0
博文 5
码字总数 5326
作品 0
海淀
技术主管
私信 提问
《Python分布式计算》 第3章 Python的并行计算 (Distributed Computing with Python)

序言 第1章 并行和分布式计算介绍 第2章 异步编程 第3章 Python的并行计算 第4章 Celery分布式应用 第5章 云平台部署Python 第6章 超级计算机群使用Python 第7章 测试和调试分布式应用 第8章...

seancheney
2017/10/13
0
0
Python 线程、线程通信、多线程

这是一篇学习Python 线程相关的内容,记录一下以备复习和开发使用,技术有限,如有问题欢迎指出,多谢。 一.GIL 全局解释器锁(cpython) 1.为什么会有这个锁:为了线程安全,减少python使用者...

rieuse
09/18
0
0
Python高级编程和异步IO并发编程

Python高级编程和异步IO并发编程 网盘地址:https://pan.baidu.com/s/1eB-BsUacBRhKxh7qXwndMQ 密码: tgba 备用地址(腾讯微云):https://share.weiyun.com/5Z3x9V0 密码:7cdnb2 针对Pytho...

人气王子333
04/23
0
0
使用 Python 进行线程编程

对于 Python 来说,并不缺少并发选项,其标准库中包括了对线程、进程和异步 I/O 的支持。在许多情况下,通过创建诸如异步、线程和子进程之类的高层模块,Python 简化了各种并发方法的使用。除...

丰圣谋
2013/08/22
0
0
Tornado实现多线程、多进程HTTP服务

背景 线上有一个相关百科的服务,返回一个query中提及的百科词条。该服务是用python实现的,以前通过thrift接口访问,现要将其改为通过HTTP访问。之前没有搭建HTTPServer的经验,因此想用pyt...

LUIS1983
09/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Hive的三种Join方式

Hive中就是把Map,Reduce的Join拿过来,通过SQL来表示。 参考链接:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins Common/Shuffle/Reduce Join Reduce Join在Hiv......

GordonNemo
14分钟前
0
0
Spark学习记录(三)核心API模块介绍

spark ------------- 基于hadoop的mr,扩展MR模型高效使用MR模型,内存型集群计算,提高app处理速度。 spark特点 ------------- 速度:在内存中存储中间结果。 支持多种语言。Scala、Java、P...

我爱春天的毛毛雨
20分钟前
0
0
PHP5、PHP7安装

11月13日任务 11.10/11.11/11.12 安装PHP5 11.13 安装PHP7 PHP官网www.php.net 当前主流版本为5.6/7.1 cd /usr/local/src/ wget http://cn2.php.net/distributions/php-5.6.32.tar.bz2 tar z......

zgxlinux
21分钟前
0
0
React 项目结构和组件命名之道

摘要: > * 原文地址:[structuring projects and naming components in react](https://hackernoon.com/structuring-projects-and-naming-components-in-react-1261b6e18d76) > * 原文作者:......

阿里云官方博客
21分钟前
2
0
无维护地稳定运行了8 年的 Hyperic HQ

最近在诊断一个系统意外停机时, 发现一个8年前部署部署的Hypeirc HQ 4.2,已经免维护,稳定运行了8年多。提供了及时的诊断信息。单击右下角的蓝色泡泡,可显示报警信息。

MartinKing
36分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部