Python中运行并行任务技巧


Posted in Python onFebruary 26, 2015

示例

标准线程多进程,生产者/消费者示例:
Worker越多,问题越大

# -*- coding: utf8 -*-
import os

import time

import Queue

import threading

from PIL import Image
def create_thumbnail(filename, size=(128, 128)):

    try:

        fp, fmt = filename.rsplit('.', 1)

        im = Image.open(filename)

        im.thumbnail(size, Image.ANTIALIAS)

        im.save((fp + '_'+'x'.join(str(i) for i in size) + '.'+fmt), im.format)

        return '%s thumbnail success!' % filename

    except Exception:

        return '%s thumbnail failed!' % filename


def get_image_paths(folder):

    return [os.path.join(folder, f) for f in os.listdir(folder) if 'png' in f]


class Consumer(threading.Thread):

    def __init__(self, queue):

        threading.Thread.__init__(self)

        self._queue = queue
    def run(self):

        while True:

            content = self._queue.get()

            if isinstance(content, str) and content == 'quit':

                break

            respone = create_thumbnail(content)

        print 'Bye bye!'


def Producer():

    filenames = get_image_paths('images')

    queue = Queue.Queue()

    worker_threads = build_worker_pool(queue, 4)

    start_time = time.time()
    for filename in filenames:

        queue.put(filename)

    for worker in worker_threads:

        queue.put('quit')

    for worker in worker_threads:

        worker.join()
    print time.time() - start_time


def build_worker_pool(queue, size):

    workers = []

    for _ in range(size):

        worker = Consumer(queue)

        worker.start()

        workers.append(worker)

    return workers


if __name__ == '__main__':

    Producer()

map

Map能够处理集合按顺序遍历,最终将调用产生的结果保存在一个简单的集合当中。

Python中运行并行任务技巧

# -*- coding: utf8 -*-
import os

import time

from multiprocessing import Pool

from PIL import Image
def create_thumbnail(filename, size=(128, 128)):

    try:

        fp, fmt = filename.rsplit('.', 1)

        im = Image.open(filename)

        im.thumbnail(size, Image.ANTIALIAS)

        im.save((fp + '_'+'x'.join(str(i) for i in size) + '.'+fmt), im.format)

        return '%s thumbnail success!' % filename

    except Exception:

        return '%s thumbnail failed!' % filename


def get_image_paths(folder):

    return [os.path.join(folder, f) for f in os.listdir(folder) if 'png' in f]


def main():

    filenames = get_image_paths('images')

    start_time = time.time()

    

    pool = Pool(4)

    pool.map(create_thumbnail, filenames)

    pool.close()

    pool.join()
    print time.time() - start_time


if __name__ == '__main__':

    main()
Python 相关文章推荐
Python中tell()方法的使用详解
May 24 Python
Python中list列表的一些进阶使用方法介绍
Aug 15 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
Aug 18 Python
Python numpy生成矩阵、串联矩阵代码分享
Dec 04 Python
pytorch 数据集图片显示方法
Jul 26 Python
Python re 模块findall() 函数返回值展现方式解析
Aug 09 Python
解决Pycharm的项目目录突然消失的问题
Jan 20 Python
python实现贪吃蛇游戏源码
Mar 21 Python
python中有函数重载吗
May 28 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
Jul 01 Python
python上下文管理的使用场景实例讲解
Mar 03 Python
python3.7.2 tkinter entry框限定输入数字的操作
May 22 Python
Python通过递归遍历出集合中所有元素的方法
Feb 25 #Python
Python THREADING模块中的JOIN()方法深入理解
Feb 18 #Python
python持久性管理pickle模块详细介绍
Feb 18 #Python
Python中暂存上传图片的方法
Feb 18 #Python
Python中AND、OR的一个使用小技巧
Feb 18 #Python
Python编写屏幕截图程序方法
Feb 18 #Python
Python处理RSS、ATOM模块FEEDPARSER介绍
Feb 18 #Python
You might like
PHP+JS+rsa数据加密传输实现代码
2011/03/23 PHP
apache+php完美解决301重定向的两种方法
2011/06/08 PHP
域名和cookie问题(域名后缀)
2012/10/10 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
PHP中strcmp()和strcasecmp()函数字符串比较用法分析
2016/01/07 PHP
浅谈PHP拦截器之__set()与__get()的理解与使用方法
2016/10/18 PHP
php实用代码片段整理
2016/11/12 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
用js计算页面执行时间的函数
2006/12/07 Javascript
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
使用原生javascript创建通用表单验证——更锋利的使用dom对象
2011/09/13 Javascript
js实现简单登录功能的实例代码
2013/11/09 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
js实现简单锁屏功能实例
2015/05/27 Javascript
JavaScript知识点总结(六)之JavaScript判断变量数据类型
2016/05/31 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
在js代码拼接dom对象到页面上的模板总结
2018/10/21 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
微信小程序 点击切换样式scroll-view实现代码实例
2019/10/11 Javascript
js布局实现单选按钮控件
2020/01/17 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
python基本语法练习实例
2017/09/19 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
解决python flask中config配置管理的问题
2019/07/26 Python
LUISAVIAROMA中国官网:时尚奢侈品牌购物网站
2020/11/01 全球购物
班会关于环保演讲稿
2013/12/29 职场文书
奥林匹克的口号
2014/06/13 职场文书
深入开展党的群众路线教育实践活动心得体会
2014/11/05 职场文书
MySQL update set 和 and的区别
2021/05/08 MySQL
python tkinter Entry控件的焦点移动操作
2021/05/22 Python
Python 数据可视化之Bokeh详解
2021/11/02 Python