python-线程池的两种实现方式 【转载】

  1 #!/usr/bin/env python
  2 # -*- coding:utf-8 -*-
  3
  4 import queue
  5 import threading
  6 import contextlib
  7 import time
  8
  9 StopEvent = object()
 10
 11
 12 class ThreadPool(object):
 13
 14     def __init__(self, max_num, max_task_num = None):
 15         if max_task_num:
 16             self.q = queue.Queue(max_task_num)
 17         else:
 18             self.q = queue.Queue()
 19         self.max_num = max_num
 20         self.cancel = False
 21         self.terminal = False
 22         self.generate_list = []
 23         self.free_list = []
 24
 25     def run(self, func, args, callback=None):
 26         """
 27         线程池执行一个任务
 28         :param func: 任务函数
 29         :param args: 任务函数所需参数
 30         :param callback: 任务执行失败或成功后执行的回调函数,回调函数有两个参数1、任务函数执行状态;2、任务函数返回值(默认为None,即:不执行回调函数)
 31         :return: 如果线程池已经终止,则返回True否则None
 32         """
 33         if self.cancel:
 34             return
 35         if len(self.free_list) == 0 and len(self.generate_list) < self.max_num:
 36             self.generate_thread()
 37         w = (func, args, callback,)
 38         self.q.put(w)
 39
 40     def generate_thread(self):
 41         """
 42         创建一个线程
 43         """
 44         t = threading.Thread(target=self.call)
 45         t.start()
 46
 47     def call(self):
 48         """
 49         循环去获取任务函数并执行任务函数
 50         """
 51         current_thread = threading.currentThread()
 52         self.generate_list.append(current_thread)
 53
 54         event = self.q.get()
 55         while event != StopEvent:
 56
 57             func, arguments, callback = event
 58             try:
 59                 result = func(*arguments)
 60                 success = True
 61             except Exception as e:
 62                 success = False
 63                 result = None
 64
 65             if callback is not None:
 66                 try:
 67                     callback(success, result)
 68                 except Exception as e:
 69                     pass
 70
 71             with self.worker_state(self.free_list, current_thread):
 72                 if self.terminal:
 73                     event = StopEvent
 74                 else:
 75                     event = self.q.get()
 76         else:
 77
 78             self.generate_list.remove(current_thread)
 79
 80     def close(self):
 81         """
 82         执行完所有的任务后,所有线程停止
 83         """
 84         self.cancel = True
 85         full_size = len(self.generate_list)
 86         while full_size:
 87             self.q.put(StopEvent)
 88             full_size -= 1
 89
 90     def terminate(self):
 91         """
 92         无论是否还有任务,终止线程
 93         """
 94         self.terminal = True
 95
 96         while self.generate_list:
 97             self.q.put(StopEvent)
 98
 99         self.q.queue.clear()
100
101     @contextlib.contextmanager
102     def worker_state(self, state_list, worker_thread):
103         """
104         用于记录线程中正在等待的线程数
105         """
106         state_list.append(worker_thread)
107         try:
108             yield
109         finally:
110             state_list.remove(worker_thread)
111
112
113
114 # How to use
115
116
117 pool = ThreadPool(5)
118
119 def callback(status, result):
120     # status, execute action status
121     # result, execute action return value
122     pass
123
124
125 def action(i):
126     print(i)
127
128 for i in range(30):
129     ret = pool.run(action, (i,), callback)
130
131 time.sleep(5)
132 print(len(pool.generate_list), len(pool.free_list))
133 print(len(pool.generate_list), len(pool.free_list))
134 # pool.close()
135 # pool.terminate()

线程池(优秀)

 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 import Queue
 4 import threading
 5
 6
 7 class ThreadPool(object):
 8
 9     def __init__(self, max_num=20):
10         self.queue = Queue.Queue(max_num)
11         for i in xrange(max_num):
12             self.queue.put(threading.Thread)
13
14     def get_thread(self):
15         return self.queue.get()
16
17     def add_thread(self):
18         self.queue.put(threading.Thread)
19
20 """
21 pool = ThreadPool(10)
22
23 def func(arg, p):
24     print arg
25     import time
26     time.sleep(2)
27     p.add_thread()
28
29
30 for i in xrange(30):
31     thread = pool.get_thread()
32     t = thread(target=func, args=(i, pool))
33     t.start()
34 """

转载
作者:武沛齐 
出处:http://www.cnblogs.com/wupeiqi/

时间: 2024-11-08 18:25:31

python-线程池的两种实现方式 【转载】的相关文章

Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载

 在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是通过AsyncTask来实现,另一种方式则是通过ThreadPool来实现,今天我们就通过一个例子来讲解和对比这两种实现方式.     项目的结构如下所示:     在今天这个例子里,我们用到了之前一篇文章中写过的一个自定义控件,如果有同学感兴趣的话可以点击这里来先研究下这个控件的实现,为了配合异

Java线程池的四种创建方式

Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程. newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行. newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保

线程池的5种创建方式

1. Single Thread Executor:只有一个线程的线程池,因此所有提交的任务是顺序执行. 代码:Executors.newSingleThreadExecutor() 2. Cached Thread Pool:线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,如果线程超过60秒内没执行,那么将被终止并从池中删除. 代码:Executors.newCachedThreadPool() 3. Fixed Thread Pool:拥有固定线程数的线程池,如果没有任

Java---11---多线程的两种创建方式

多线程的两种创建方式: 下面这些东西是API文档中的: public class Thread extends Object implements Runnable 线程 是程序中的执行线程.Java 虚拟机允许应用程序并发地运行多个执行线程. 每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程.每个线程都可以或不可以标记为一个守护程序.当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护

python实现快速排序算法(两种不同实现方式)

# -*- coding: utf-8 -*- """ Created on Fri May 16 17:24:05 2014 @author: lifeix """ #快速排序 import sys import random length = 30 def qsort(arr,left,right): lp = left rp = right if lp == rp:return while True: while arr[lp] >=

Python 引入包的两种方式区别

1.import XXX仅仅是告诉我们需要使用这个包,但是你真正使用的时候,需要完整的导入这个包的全路径 比如: import wechat.views 在使用其中的hello函数的时候,需要 wechat.views.hello - 这个路径不能简略 2.from ... import ...就不需要指定父的路径了 比如: from wechat.views import *    #你可以使用views内部的变量 你就可以直接使用其中的hello hello 但是如果: from wecha

Java学习(九):Java线程的两种实现方式

线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指运行中的程序的调度单位.在单个程序中同时运行多个线程完成不同的工作,称为多线程. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础. Java线程创建的两种方式: 1.继承Thread类 public class MyThread extends Thread { private String name;

Python实现屏幕截图的两种方式

Python实现屏幕截图有两种方式: 使用windows API 使用PIL中的ImageGrab模块 下面对两者的特点和用法进行详细解释. 一.Python调用windows API实现屏幕截图 好处是 灵活 速度快 缺点是: 写法繁琐 不跨平台 import time import win32gui, win32ui, win32con, win32api def window_capture(filename): hwnd = 0 # 窗口的编号,0号表示当前活跃窗口 # 根据窗口句柄获取

线程的两种实现方式

线程有两种实现方式 一,Thread类 public class Thread implements Runnable{ } 二,Runnable接口 public interface Runnable{ public abstract void run(); } 区别:Thread是一个类,他继承了runnable接口,而runnable是一个接口, 一个类只能有一个父类,但是可以有多个接口,所以在拓展型方面,ruannale有更好的拓展性,更加灵活 Runnable还可以用于资源共享 1.