对Python线程池
下面给大家总结一下自己总结的对Python线程池经验之谈,对于那些没有接触学习过编程语言或者多开发语言略懂的用户而言,Python语言绝对是最好的选择之一,并建议初学的程序员先从Python开始学习编程。
- import Queue, threading, sys
- from threading import Thread
- import time,urllib
- # working thread
- class Worker(Thread):
- def __init__( self, workQueue, resultQueue, , **kwds):
- Thread.__init__( self, **kwds )
- self.id = Worker.worker_count
- Worker.worker_count += 1
- self.setDaemon( True )
- self.workQueue = workQueue
- self.resultQueue = resultQueue
- self.timeout = timeout
- self.start( )
- def run( self ):
- ''' the get-some-work, do-some-work main loop of worker threads '''
- while True:
- try:
- callable, args, kwds = self.workQueue.get(timeout=self.timeout)
- res = callable(*args, **kwds)
- print "worker[%2d]: %s" % (self.id, str(res) )
- self.resultQueue.put( res )
- except Queue.Empty:
- break
- except :
- print 'worker[%2d]' % self.id, sys.exc_info()[:2]
- class WorkerManager:
- def __init__( self, , ):
- self.workQueue = Queue.Queue()
- self.resultQueue = Queue.Queue()
- self.workers = []
- self.timeout = timeout
- self._recruitThreads( num_of_workers )
- def _recruitThreads( self, num_of_workers ):
- for i in range( num_of_workers ):
- worker = Worker( self.workQueue, self.resultQueue, self.timeout )
- self.workers.append(worker)
- def wait_for_complete( self):
- # ...then, wait for each of them to terminate:
- while len(self.workers):
- worker = self.workers.pop()
- worker.join( )
- if worker.isAlive() and not self.workQueue.empty():
- self.workers.append( worker )
- print "All jobs are are completed."
- def add_job( self, callable, *args, **kwds ):
- self.workQueue.put( (callable, args, kwds) )
- def get_result( self, *args, **kwds ):
- return self.resultQueue.get( *args, **kwds )
Worker类是一个Python线程池,不断地从workQueue队列中获取需要执行的任务,执行之,并将结果写入到resultQueue中。这里的workQueue和resultQueue都是现成安全的,其内部对各个线程的操作做了互斥。当从workQueue中获取任务超时,则线程结束。
WorkerManager负责初始化Python线程池,提供将任务加入队列和获取结果的接口,并能等待所有任务完成。一个典型的测试例子如下,它用10个线程去下载一个固定页面的内容,实际应用时应该是执行不同的任务。
- def test_job(id, .001 ):
- try:
- urllib.urlopen('[url]https://www.gmail.com/[/url]').read()
- except:
- print '[%4d]' % id, sys.exc_info()[:2]
- return id
- def test():
- import socket
- socket.setdefaulttimeout(10)
- print 'start testing'
- wm = WorkerManager(10)
- for i in range(500):
- wm.add_job( test_job, i, i*0.001 )
- wm.wait_for_complete()
- print 'end testing'
对Python线程池的更多相关文章
- 自定义高级版python线程池
基于简单版创建类对象过多,现自定义高级版python线程池,代码如下 #高级线程池 import queue import threading import time StopEvent = obje ...
- Python 线程池(小节)
Python 线程池(小节) from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import os,time, ...
- python线程池ThreadPoolExecutor(上)(38)
在前面的文章中我们已经介绍了很多关于python线程相关的知识点,比如 线程互斥锁Lock / 线程事件Event / 线程条件变量Condition 等等,而今天给大家讲解的是 线程池ThreadP ...
- python线程池及其原理和使用
python线程池及其原理和使用 2019-05-29 17:05:20 whatday 阅读数 576 系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互.在这种情形下,使用线程池可以很 ...
- python线程池示例
使用with方式创建线程池,任务执行完毕之后,会自动关闭资源 , 否则就需要手动关闭线程池资源 import threading, time from concurrent.futures impo ...
- Python线程池与进程池
Python线程池与进程池 前言 前面我们已经将线程并发编程与进程并行编程全部摸了个透,其实我第一次学习他们的时候感觉非常困难甚至是吃力.因为概念实在是太多了,各种锁,数据共享同步,各种方法等等让人十 ...
- python线程池实现
python 的线程池主要有threadpool,不过它并不是内置的库,每次使用都需要安装,而且使用起来也不是那么好用,所以自己写了一个线程池实现,每次需要使用直接import即可.其中还可以根据传入 ...
- 《转》python线程池
线程池的概念是什么? 在IBM文档库中这样的一段描写:“在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象 ...
- 一个简单的python线程池框架
初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下:(不足之处,还请高手指正) ...
随机推荐
- LeetCode 110 Balanced Binary Tree(平衡二叉树)(*)
翻译 给定一个二叉树,决定它是否是高度平衡的. (高度是名词不是形容词-- 对于这个问题.一个高度平衡二叉树被定义为: 这棵树的每一个节点的两个子树的深度差不能超过1. 原文 Given a bina ...
- 【BIRT】报表显示不全
使用BIRT开发了一张报表,预期效果如下 但是开发完成后预览效果如下: 最后的合计竟然没有了,那么怎么处理呢 鼠标点击Layout窗口空白部分,找到布局,切换为自动布局,如下图所示:
- ASP.NET总结
ASP.NET已经学习完.学牛腩的时候面对一些控件和方法会用,但对当中的原理还不懂.学习这部分的内容时, 从头到尾都有一种相识的感觉,把之前一些不懂得地方也理解了,每个知识都有相应的样例练习,学起来还 ...
- 关闭mysql慢查询日志
开启mysql慢日志 MySQL的慢查询日志是MySQL提供的一种日志记录,它用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查 ...
- ubuntu下载软件安装包
apt-get -d download xxx ubuntu下载软件安装包命令.仅仅下载deb格式的安装包,不安装. xxx是待下载的安装包.
- tp类型自动转换和自动完成
一.类型自动转换 在模型中对数据库字段自动完成 //模型中数据类型自动转换 添加一个$type数组即可protected $type=array( 'username'=>'serialize' ...
- 删除mysql数据库表里的记录
如果记录不再需要,可以用delete 命令进行删除,语法如下: DELETE FROM tablename [WHERE CONDITION] 例如,在emp 中将ename 为‘dony’的记录全部 ...
- mac 系统使用macaca inspector 获取iphone真机应用元素
1.安装brew 软件包管理工具:/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/inst ...
- informix-時間格式的各種用法
以下是我在網路上所收集到的關於informix 時間的sql函數用法,有在使用informix資料庫的人,可以參考看看囉! today,返回現在系統日期 current 返回現在日期含時間,相當於sq ...
- Unity3D安卓交互 - 使代码运行在UI线程
runOnUiThread(new Runnable() { public void run() { // TODO Auto-generated method stub } });