- 浏览: 2663483 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
关于线程池(thread pool)的概念请参考http://en.wikipedia.org/wiki/Thread_pool_pattern。在Python中使用线程是有硬伤的,因为Python(这里指C语言实现的Python)的基本调用都最后生成对应C语言的函数调用,因此Python中使用线程的开销太大,不过可以使用Stackless Python(Python的一个修改版)来增强Python中使用线程的表现。
同时由于Python中GIL的存在,导制在使用多CPU时Python无法充分利用多个CPU,目前pysco这个模块可以针对多CPU提高Python的效率。
在C语言里要实现个线程池,就要面对一堆的指针,还有pthread这个库中那些看起来很让人头痛的一些函数:
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
而如果用Python来实现一个线程池的话就好多了,不仅结构十分清晰,而且代码看起来会很优美:
同时由于Python中GIL的存在,导制在使用多CPU时Python无法充分利用多个CPU,目前pysco这个模块可以针对多CPU提高Python的效率。
在C语言里要实现个线程池,就要面对一堆的指针,还有pthread这个库中那些看起来很让人头痛的一些函数:
int pthread_create(pthread_t *restrict thread,
const pthread_attr_t *restrict attr,
void *(*start_routine)(void*), void *restrict arg);
而如果用Python来实现一个线程池的话就好多了,不仅结构十分清晰,而且代码看起来会很优美:
## {{{ http://code.activestate.com/recipes/203871/ (r3) import threading from time import sleep # Ensure booleans exist (not needed for Python 2.2.1 or higher) try: True except NameError: False = 0 True = not False class ThreadPool: """Flexible thread pool class. Creates a pool of threads, then accepts tasks that will be dispatched to the next available thread.""" def __init__(self, numThreads): """Initialize the thread pool with numThreads workers.""" self.__threads = [] self.__resizeLock = threading.Condition(threading.Lock()) self.__taskLock = threading.Condition(threading.Lock()) self.__tasks = [] self.__isJoining = False self.setThreadCount(numThreads) def setThreadCount(self, newNumThreads): """ External method to set the current pool size. Acquires the resizing lock, then calls the internal version to do real work.""" # Can't change the thread count if we're shutting down the pool! if self.__isJoining: return False self.__resizeLock.acquire() try: self.__setThreadCountNolock(newNumThreads) finally: self.__resizeLock.release() return True def __setThreadCountNolock(self, newNumThreads): """Set the current pool size, spawning or terminating threads if necessary. Internal use only; assumes the resizing lock is held.""" # If we need to grow the pool, do so while newNumThreads > len(self.__threads): newThread = ThreadPoolThread(self) self.__threads.append(newThread) newThread.start() # If we need to shrink the pool, do so while newNumThreads < len(self.__threads): self.__threads[0].goAway() del self.__threads[0] def getThreadCount(self): """Return the number of threads in the pool.""" self.__resizeLock.acquire() try: return len(self.__threads) finally: self.__resizeLock.release() def queueTask(self, task, args=None, taskCallback=None): """Insert a task into the queue. task must be callable; args and taskCallback can be None.""" if self.__isJoining == True: return False if not callable(task): return False self.__taskLock.acquire() try: self.__tasks.append((task, args, taskCallback)) return True finally: self.__taskLock.release() def getNextTask(self): """ Retrieve the next task from the task queue. For use only by ThreadPoolThread objects contained in the pool.""" self.__taskLock.acquire() try: if self.__tasks == []: return (None, None, None) else: return self.__tasks.pop(0) finally: self.__taskLock.release() def joinAll(self, waitForTasks = True, waitForThreads = True): """ Clear the task queue and terminate all pooled threads, optionally allowing the tasks and threads to finish.""" # Mark the pool as joining to prevent any more task queueing self.__isJoining = True # Wait for tasks to finish if waitForTasks: while self.__tasks != []: sleep(.1) # Tell all the threads to quit self.__resizeLock.acquire() try: self.__setThreadCountNolock(0) self.__isJoining = True # Wait until all threads have exited if waitForThreads: for t in self.__threads: t.join() del t # Reset the pool for potential reuse self.__isJoining = False finally: self.__resizeLock.release() print 'ok' class ThreadPoolThread(threading.Thread): """ Pooled thread class. """ threadSleepTime = 0.1 def __init__(self, pool): """ Initialize the thread and remember the pool. """ threading.Thread.__init__(self) self.__pool = pool self.__isDying = False def run(self): """ Until told to quit, retrieve the next task and execute it, calling the callback if any. """ while self.__isDying == False: cmd, args, callback = self.__pool.getNextTask() # If there's nothing to do, just sleep a bit if cmd is None: sleep(ThreadPoolThread.threadSleepTime) elif callback is None: cmd(args) else: callback(cmd(args)) def goAway(self): """ Exit the run loop next time through.""" self.__isDying = True # Usage example if __name__ == "__main__": from random import randrange # Sample task 1: given a start and end value, shuffle integers, # then sort them def sortTask(data): print "SortTask starting for ", data numbers = range(data[0], data[1]) for a in numbers: rnd = randrange(0, len(numbers) - 1) a, numbers[rnd] = numbers[rnd], a print "SortTask sorting for ", data numbers.sort() print "SortTask done for ", data return "Sorter ", data # Sample task 2: just sleep for a number of seconds. def waitTask(data): print "WaitTask starting for ", data print "WaitTask sleeping for %d seconds" % data sleep(data) return "Waiter", data # Both tasks use the same callback def taskCallback(data): print "Callback called for", data # Create a pool with three worker threads pool = ThreadPool(3) # Insert tasks into the queue and let them run pool.queueTask(sortTask, (1000, 100000), taskCallback) pool.queueTask(waitTask, 5, taskCallback) pool.queueTask(sortTask, (200, 200000), taskCallback) pool.queueTask(waitTask, 2, taskCallback) pool.queueTask(sortTask, (3, 30000), taskCallback) pool.queueTask(waitTask, 7, taskCallback) # When all tasks are finished, allow the threads to terminate pool.joinAll() # print 'all complete' ## end of http://code.activestate.com/recipes/203871/ }}}
发表评论
-
python读取图片exif信息
2014-11-06 10:53 2407f = open("/home/admin/tlo ... -
Python程序的执行原理
2014-04-14 15:44 17331. 过程概述 Python先把代码(.py文件)编译成字 ... -
如何创建一个短链服务
2013-12-26 16:23 0参考: http://stackoverflow.com ... -
python 解析命令参数(argument)组件argparse
2013-12-11 17:35 1410参考: http://youngsterxyf.githu ... -
pyhon命令行工具optparse
2013-11-10 16:27 1045使用python optparse 可以创建命令行工具,下面 ... -
Python在豆瓣的应用
2013-10-21 10:46 1202Python在豆瓣的应用,hongqiangning分享 ... -
用python爬虫抓站的一些技巧总结
2013-10-10 14:12 1686学用python也有3个多月了,用得最多的还是各类爬虫 ... -
python小技巧
2013-10-10 11:50 7481. 声明长度256的数组 a=[0]*256 ... -
使用tesseract-ocr破解网站验证码
2013-10-09 10:25 1215原文:使用tesseract-ocr破解网站验证码 ... -
和豆瓣CMGS交流
2013-06-20 17:36 5849蒋云鹏: 在?CMGS: 在蒋 ... -
python乱码问题('ascii' codec can't encode character u'\u4e2d' in position 0)
2013-05-20 19:03 4258>>> k = u'中' >> ... -
python shell 交互模式
2013-04-28 22:17 1643python 通过code模块可以很容易的进入交互模式: ... -
jython和gunicorn性能测试对比
2013-04-13 13:03 1313helloworld,笔记本上: gunicorn ... -
python的mysql客户端-MySQLdb
2013-04-04 10:13 1176平时的主要编程语言是Java,开发时也主要用Mysql,经常 ... -
Python几种并发实现方案的性能比较
2013-03-18 21:14 2970原文:http://www.elias.cn/P ... -
python汉字和Unicode码(utf-8)之间的转换(Pack/Unpack)
2013-03-18 21:13 1654保证你要转换的字符串编码为UTF8,如果不是,请iconv ... -
python反序列化的坑
2013-01-06 18:06 1285今天遇到python一个坑,调用memcached的get_m ... -
sqlalchemy connection pool.py 源代码
2012-12-29 22:58 2254把 sqlalchemy pool源代码copy下来,有空看看 ... -
SQLAlchemy简单介绍
2012-12-28 22:41 0文档参考:http://docs.sqlalchemy.org ... -
pymysql简单使用
2012-12-28 12:38 2125import pymysql conn = pymysq ...
相关推荐
本文实例讲述了python实现线程池的方法。分享给大家供大家参考。具体如下: 原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码 文件名:thrd_pool.py 系统...
首先,Python标准库提供了一个名为`concurrent.futures`的模块,其中包含`ThreadPoolExecutor`类,它是实现线程池功能的基础。`ThreadPoolExecutor`允许我们创建一个线程池对象,通过`submit()`方法提交任务,`...
本篇将介绍如何使用Python实现一个线程池,该线程池还能根据设定的时间自动扩展和减少线程数量。 首先,我们导入所需的库:`queue`用于创建任务队列,`threading`用于处理线程相关操作,`time`和`datetime`用于时间...
原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码 import threading import time import signal import os class task_info(object): ...
在Python2.7中,虽然`concurrent.futures`模块没有被引入,但开发者可以通过`threading`模块自己实现线程池。描述中提到的"由7个类组成的小线程池"可能包括以下组件: 1. **ThreadPool类**:这是线程池的核心,负责...
一、线程池 1、为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。...比如:延时执行、定时循环执行的策略等,运用线程池都能进行很好的实现。 2、
其中一个线程安全的队列是实现线程池和任务队列的基础,本节我们通过threading包中的互斥量threading.Lock()和条件变量threading.Condition()来实现一个简单的、读取安全的线程队列。 原创文章 15获赞 0访问量 557
线程池的概念是什么? 在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以...
基于Python的线程池。 -------- 该资源内项目源码是个人的毕设,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! <项目介绍> 1、该资源内项目代码都经过测试运行成功,功能ok的...
### 知识点详解:用Python实现线程池 #### 一、线程池概念与原理 线程池是一种管理并复用多个线程的方法,主要用于处理大量的短期任务。通过预创建一组工作线程,当有新任务到达时,线程池会分配一个空闲线程来处理...
综上所述,Python语言在实现线程池方面的应用不仅必要而且高效。它能够极大地减少线程维护的开销,提升程序处理多并发任务的能力,从而在处理大量维护对象时展现出卓越的性能。然而,在构建和应用线程池时,也应当...
本文实例讲述了Python自定义线程池实现方法。分享给大家供大家参考,具体如下: 关于python的多线程,由与GIL的存在被广大群主所诟病,说python的多线程不是真正的多线程。但多线程处理IO密集的任务效率还是可以杠杠...
### 浅谈Python线程池ThreadPool之实现 ...`threadpool`库提供了一种简单易用的方式实现线程池功能,适用于各种多线程编程场景。理解线程池的基本概念和工作流程对于编写高效、可维护的并发程序至关重要。
在Python中,`concurrent.futures`模块提供了`ThreadPoolExecutor`类来实现线程池。线程池有两种执行模式:抢占式和非抢占式。 抢占式线程池使用`submit()`方法提交任务,它会随机选择一个线程来执行任务,即使执行...
本文将详细介绍Python线程池Threadpool的实现,涉及的概念、设计和编程方法,适合希望深入理解和使用Python线程池的开发者。 首先,让我们了解线程池中的核心组件。线程池Threadpool实现篇中会涉及到以下术语和概念...