知行编程网知行编程网  2022-11-17 18:30 知行编程网 隐藏边栏  3 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于进一步认识python线程池的相关知识,希望可以帮到处于编程学习途中的小伙伴

了解有关 python 线程池的更多信息


线程池的概念是什么?

在面向对象的编程中,创建和销毁对象非常耗时,因为创建对象需要获取内存资源或其他资源。在 Java 中更是如此,虚拟机将尝试跟踪每个对象,以便在对象被销毁后对其进行垃圾收集。因此,提高服务程序效率的一种方法是尽量减少创建和销毁对象的数量,尤其是一些资源非常密集的对象的创建和销毁。如何利用已有的对象来服务是一个需要解决的关键问题。事实上,这就是产生一些“资源汇集”技术的原因。

我理解线程池是一个存储很多线程的单元,也有对应的任务队列。整个执行过程其实就是利用线程池中有限的线程来完成任务队列中的任务。这样做的好处是你不需要为每个任务创建一个线程,因为当你创建第 100 个线程来执行第 100 个任务时,可能已经有 50 个线程完成了工作。因此,线程被复用来执行任务,减少了系统资源的开销。

一个不恰当的比喻是,有 100 个主机箱需要从 1 楼搬到 2 楼。你无需召集 100 个人来帮助你搬家。你只需要叫十个或二十个人,每个人分配十个。一五个甚至谁移动得更快,就会移动得更多,并且知道完成是未知的。 (这个比喻就像……)

反正,大致了解线程池的概念。那么如何在python中实现呢?

代码如下

# !/usr/bin/env python
# -*- coding:utf-8 -*-
# ref_blog:http://www.open-open.com/home/space-5679-do-blog-id-3247.html
import Queue
import threading
import time
class WorkManager(object):
    def __init__(self, work_num=1000,thread_num=2):
        self.work_queue= Queue.Queue()
        self.threads= []
        self.__init_work_queue(work_num)
        self.__init_thread_pool(thread_num)
    """
        初始化线程
    """
    def __init_thread_pool(self,thread_num):
        for iin range(thread_num):
            self.threads.append(Work(self.work_queue))
    """
        初始化工作队列
    """
    def __init_work_queue(self, jobs_num):
        for iin range(jobs_num):
            self.add_job(do_job, i)
    """
        添加一项工作入队
    """
    def add_job(self, func,*args):
        self.work_queue.put((func,list(args)))#任务入队,Queue内部实现了同步机制
    """
        检查剩余队列任务
    """
    def check_queue(self):
        return self.work_queue.qsize()
    """
        等待所有线程运行完毕
    """ 
    def wait_allcomplete(self):
        for itemin self.threads:
            if item.isAlive():item.join()
class Work(threading.Thread):
    def __init__(self, work_queue):
        threading.Thread.__init__(self)
        self.work_queue= work_queue
        self.start()
    def run(self):
        #死循环,从而让创建的线程在一定条件下关闭退出
        while True:
            try:
                do, args= self.work_queue.get(block=False)#任务异步出队,Queue内部实现了同步机制
                do(args)
                self.work_queue.task_done()#通知系统任务完成
            except Exception,e:
                print str(e)
                break
#具体要做的任务
def do_job(args):
    print args
    time.sleep(0.1)#模拟处理时间
    print threading.current_thread(),list(args)
if __name__== '__main__':
    start= time.time()
    work_manager=  WorkManager(10,2)#或者work_manager =  WorkManager(10000, 20)
    work_manager.wait_allcomplete()
    end= time.time()
    print "cost all time: %s" % (end-start)

这个代码清晰易懂。

整个代码中只有两个类:WorkManager 和 Work。前者确实是一个管理器,顾名思义,管理线程池和任务队列,而后者是一个特定的线程。

它的整个操作逻辑是将指定数量的任务和线程分配给WorkManager,然后每个线程从任务队列中获取任务执行,直到队列中没有任务为止。这里也用到了Queue内部的同步机制(至于同步机制,还没有研究过)。

总结一下这样一个线程池的作用,对于我的初衷来说,这个东西是永远不会on的,因为我需要在网页上控制线程的启动和停止,而这个线程池似乎只是用来完成任务的同时。但是我觉得它虽然对控制线程没有任何作用,但是它在并发执行任务方面的作用还是相当不错的,可能会用在爬取网页的部分。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享