博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用python实现的线程池
阅读量:7174 次
发布时间:2019-06-29

本文共 2639 字,大约阅读时间需要 8 分钟。

python3标准库里自带线程池和进程池。

如果你用的是python2,那可以下载一个模块,叫,这是线程池。对于进程池可以使用python自带的。

当然也可以自己写一个threadpool。

# coding:utf-8import Queueimport threadingimport sysimport timeimport mathclass WorkThread(threading.Thread):    def __init__(self, task_queue):        threading.Thread.__init__(self)        self.setDaemon(True)        self.task_queue = task_queue        self.start()        self.idle = True    def run(self):        sleep_time = 0.01  # 第1次无任务可做时休息10毫秒        multiply = 0        while True:            try:                # 从队列中取一个任务                func, args, kwargs = self.task_queue.get(block=False)                self.idle = False                multiply = 0                # 执行之                func(*args, **kwargs)            except Queue.Empty:                time.sleep(sleep_time * math.pow(2, multiply))                self.idle = True                multiply += 1                continue            except:                print sys.exc_info()                raiseclass ThreadPool:    def __init__(self, thread_num=10, max_queue_len=1000):        self.max_queue_len = max_queue_len        self.task_queue = Queue.Queue(max_queue_len)  # 任务等待队列        self.threads = []        self.__create_pool(thread_num)    def __create_pool(self, thread_num):        for i in xrange(thread_num):            thread = WorkThread(self.task_queue)            self.threads.append(thread)    def add_task(self, func, *args, **kwargs):        '''添加一个任务,返回任务等待队列的长度           调用该方法前最后先调用isSafe()判断一下等待的任务是不是很多,以防止提交的任务被拒绝        '''        try:            self.task_queue.put((func, args, kwargs))        except Queue.Full:            raise  # 队列已满时直接抛出异常,不给执行        return self.task_queue.qsize()    def isSafe(self):        '''等待的任务数量离警界线还比较远        '''        return self.task_queue.qsize() < 0.9 * self.max_queue_len    def wait_for_complete(self):        '''等待提交到线程池的所有任务都执行完毕        '''        #首先任务等待队列要变成空        while not self.task_queue.empty():            time.sleep(1)        # 其次,所以计算线程要变成idle状态        while True:            all_idle = True            for th in self.threads:                if not th.idle:                    all_idle = False                    break            if all_idle:                break            else:                time.sleep(1)if __name__ == '__main__':    def foo(a, b):        print a + b        time.sleep(0.01)    thread_pool = ThreadPool(10, 100)    '''在Windows上测试不通过,Windows上Queue.Queue不是线程安全的'''    size = 0    for i in xrange(10000):        try:            size = thread_pool.add_task(foo, i, 2 * i)        except Queue.Full:            print 'queue full, queue size is ', size    time.sleep(2)

  

转载地址:http://eubzm.baihongyu.com/

你可能感兴趣的文章
最火的Android开源项目(2)
查看>>
学习java中的几个Map-我们到底能走多远系列(27)
查看>>
【Android】编译CM10遇到的错误解决方案
查看>>
为了挺医生一把! 转抄自QQ群
查看>>
Fedora17下配置nfs
查看>>
我本将心向明月,奈何明月照沟渠_百度百科
查看>>
DataGridView “Insert into 语句的语法错误”的解决方法
查看>>
17个常见Python运行时错误[转]
查看>>
Windows 系统提示“内存不足”的原因及解决方法
查看>>
【算法】算法的艺术(一)
查看>>
笔记本做wifi热点
查看>>
启动64位 IIS 32位应用程序的支持
查看>>
按列拼接文件
查看>>
“无法识别的配置节system.webServer”解决办法
查看>>
Java多线程-新特征-锁(下)
查看>>
bitmap算法
查看>>
C#HTTP代理的实现之注册表实现
查看>>
ORACLE用SYS登录报ORA-28009:connection as SYS should be as SYSDBA OR SYSOPER解决方法
查看>>
foreach使用
查看>>
CubieBoard 简单入门
查看>>