国产成人AV无码一二三区,少女1到100集,国产精品久久久久精品综合紧,巜公妇之诱感肉欲HD在线播放

文章 > Python高级 > 进一步认识python线程池

进一步认识python线程池

头像

silencement

2019-07-23 11:09:314291浏览 · 0收藏 · 0评论

线程池的概念是什么?

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在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内部的同步机制(至于是啥同步机制目前还没去研究)。

总结一下这样一个线程池的作用,对于我本来的目的其实这个东西是永不上的,因为我需要在web页面来控制线程的启动和停止,而这个线程池看起来只是用来并发完任务的。不过我想虽然在控制线程方面没有作用,但是它的并发执行任务的作用还是蛮不错,或许可以用在爬网页的部分。

关注

关注公众号,随时随地在线学习

本教程部分素材来源于网络,版权问题联系站长!

少女配狗播放视频| 国产免费观看高清电视剧| 老公太长了每次都扎的肚子疼 | 暴躁老妈全集观看免费版| 久久久久久精品国产三级涨奶| 母亲とが话しています读音 | 办公室狂C小雪秘书好爽H | 狗配人的大片视频大全| 高清无码| 李丽珍| 朝桐光| 苍井空做爰高潮A片| 邻居少妇让我爽了三次| NO3B| 7777777亚洲和欧洲尺码表| 妈妈的闺蜜| 门卫老王破校花处柳玉倩| 高清大片CSGO免费| 《交换做爰》在线观看| 日亚M码是日本的还是中国的 | 我故意对着床上的小能做手工图片 | 黑料吃瓜| 法国《监狱伦理3》| 《军妓肉体》在线观看| 欧美黑人狂躁日本妞| 3DMAX9喷射2D3D区别漫..| 啄木鸟军舰女兵3法版| 欧美一区二区| 两个奶头被吃得又翘又肿特别疼 | 荷兰日B赛现场视频| 马配人能配进去吗| 粘液共生1~3集免费观看动漫| 苍老师巅峰之作第37集| 《临时夫妻之孽缘》| 久久婷婷五月综合色国产香蕉| 结城みさ| 《诱人的护士》苍井空-| 同学的母亲中字ID| 亚洲一区二区三区| [汉化版]全彩漫画免费阅读| 一晚上12次干到都没水了