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 datetime时间格式化去掉前导0
Jul 31 Python
Python中if __name__ == "__main__"详细解释
Oct 21 Python
Python简单的制作图片验证码实例
May 31 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
一篇文章快速了解Python的GIL
Jan 12 Python
Python中的类与类型示例详解
Jul 10 Python
TensorBoard 计算图的查看方式
Feb 15 Python
python 如何利用argparse解析命令行参数
Sep 11 Python
python打包生成so文件的实现
Oct 30 Python
Python Http请求json解析库用法解析
Nov 28 Python
python 实现波浪滤镜特效
Dec 02 Python
Python实现位图分割的效果
Nov 20 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引用地址改变变量值的问题
2012/03/23 PHP
浅谈php错误提示及查错方法
2015/07/14 PHP
PHP+MYSQL实现读写分离简单实战
2017/03/13 PHP
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
禁止空格提交表单的js代码
2013/11/17 Javascript
浏览器窗口加载和大小改变事件示例
2014/02/27 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
jquery插件EasyUI中form表单提交实例分享
2016/01/11 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
jQuery Ajax页面局部加载方法汇总
2016/06/02 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
JS实现读取xml内容并输出到div中的方法示例
2018/04/19 Javascript
JavaScript生成指定范围随机数和随机序列的方法
2018/05/05 Javascript
每个 JavaScript 工程师都应懂的33个概念
2018/10/22 Javascript
js中位运算的运用实例分析
2018/12/11 Javascript
jQuery Migrate 插件用法实例详解
2019/05/22 jQuery
jQuery Ajax async=>false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
原理深度解析Vue的响应式更新比React快
2020/04/04 Javascript
初步认识Python中的列表与位运算符
2015/10/12 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
Django自定义用户表+自定义admin后台中的字段实例
2019/11/18 Python
python随机模块random使用方法详解
2020/02/14 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
类、抽象类、接口的差异
2016/06/13 面试题
程序员经常用到的UNIX命令
2015/04/13 面试题
酒店总经理助理职责
2014/02/12 职场文书
优秀管理者事迹材料
2014/05/22 职场文书
党的群众路线教育实践活动宣传标语口号
2014/06/06 职场文书
vue-cropper插件实现图片截取上传组件封装
2021/05/27 Vue.js
MySQL快速插入一亿测试数据
2021/06/23 MySQL
使用Nginx的访问日志统计PV与UV
2022/05/06 Servers