这篇文章主要为大家详细介绍了python线程池菜鸟教程,具有一定的参考价值,可以用来参考一下。

对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!

线程池的概念是什么?

在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些 很耗资源的对象创建和销毁。如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因。

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

一个不怎么恰当的比喻就是,有100台电脑主机箱需要从1楼搬到2楼,你不需要喊来100人帮忙搬,你只需要叫十个或者二十个人就足以,每个人分配十个或者五个甚至是谁搬的快谁就多搬知道完成未知。(这个比喻好像。。。。。)

不管如何吧,大体上理解了线程池的概念。那么怎么用python实现呢?

代码如下

# @param python线程池进一步认识

# @author 512笔记|512PiC.com

# !/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 i in range(thread_num):

self.threads.append(Work(self.work_queue))

"""

初始化工作队列

"""

def __init_work_queue(self, jobs_num):

for i in 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 item in 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)

# End www_512pic_com

这个代码清晰易懂。

整个代码只有两个类:WorkManager和Work,前者确实如命名所示,是一个管理者,管理线程池和任务队列,而后者就是具体的一个线程。

它的整个运行逻辑就是,给WorkManager分配制定的任务量和线程数,然后每个线程都从任务队列中获取任务来执行,直到队列中没有任务。这里面也用到了Queue内部的同步机制(至于是啥同步机制目前还没去研究)。

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

注:关于python线程池菜鸟教程的内容就先介绍到这里,更多相关文章的可以留意512笔记的其他信息。

关键词:线程池

您可能感兴趣的文章

python线程创建对象_python线程池菜鸟教程相关推荐

  1. python线程创建对象_Python线程下thread对象的用法介绍(附实例)

    本篇文章给大家带来的内容是关于Python线程下thread对象的用法介绍(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. Thread对象 Thread类用于表示单独的控制 ...

  2. python线程创建对象_python 多线程(一)

    (一) 线程概述 几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行中的程序就是一个进程.当一个程序运行时,内部可能包含多个顺序执流,每个顺序执行流就是一个线程. 进程和线程 ...

  3. python 判断线程状态_Python线程指南

    Python线程指南 本文介绍了Python对于线程的支持,包括"学会"多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例. 注意:本文基于Python2. ...

  4. python线程状态_Python线程

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  5. python结束线程类_Python线程指南(转)

    1. 线程基础 1.1. 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2. 线程同步(锁) 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样).但是当线程需要共享数据时,可能存在 ...

  6. python 线程退出_python线程退出

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 如果某线程并未使用很多 io 操作, 它会在自己的时间片内一直占用处理器(和 g ...

  7. python 判断线程状态_Python 线程和进程

    前言 学编程,谁没有为线程折腾过啊. 目录 线程与进程 线程与进程是操作系统里面的术语,简单来讲,每一个应用程序都有一个自己的进程. 操作系统会为这些进程分配一些执行资源,例如内存空间等. 在进程中, ...

  8. python 线程同步_python线程同步(2)

    Barrier 有人翻译成栅栏,建议使用屏障,可以想象成路障,道闸. 3.2引入python的新功能. Barrier(parties,action  = None,timeout = None):构 ...

  9. python网页爬虫菜鸟教程_Python 爬取菜鸟教程(www.runoob.com)内容。并保在本地(html格式/pdf格式)...

    最近在开始学Python 也想着做个爬虫玩玩 之前学习(php,jquery...)的时候,经常去菜鸟教程看.索性就将其教程爬下来(打印出来)翻阅起来更有感觉. 好了废话不多说先讲讲我的思路: 首先先 ...

最新文章

  1. SQLMap安装步骤
  2. oracle 11g安装桌面,Lubuntu 12.10 桌面版安装Oracle 11g
  3. [JAVA][Liferay] Configure sharding in multiple sites
  4. 数据库--循环语句:loop exit when/ end loop
  5. 数据中心大火波及360万网站,或因UPS故障,3月10日晚法国斯特拉斯堡
  6. 苏宁国美盈利报警:线下乏力线上重金加码
  7. 大型网站技术架构:核心原理与案例分析 mobi_大数据技术经典学习路线
  8. 华为企业互动社区云计算板块
  9. centos6.3安装Samba及权限
  10. 使用NHibernate, Oracle Clob/NClob无法插入
  11. iOS 常见的JS与iOS交互的需求与解决方案
  12. 数据库中多表连接的左连接、右连接、内连接、全连接的使用场景
  13. 史上最大,人工智能算法模型GPT-3问世,这意味着什么?
  14. Butterfly-蝴蝶-主题优化、美化-Lete乐特
  15. 图像处理 - ImageMagick 简单介绍与案例
  16. 点线面的意义_聊聊「点线面」的概念
  17. 1602LCD主要技术参数
  18. 舞台音效控制软件_苹果舞台现场演奏音效控制工具 MainStage 3 v3.3.1
  19. rndc: connect failed: 127.0.0.1#953: connection refused
  20. Java实现随机密码生成

热门文章

  1. 流水线生产,精益生产,TPS和TOC的缓冲管理
  2. node.js书籍_2020年11部最佳Node Js书籍
  3. 哈工大计算机系统实验六——高速缓冲器模拟
  4. 翻译:Firefox for Pentester: Privacy and Protection Configurations
  5. c语言中流水号的写法,科目一流水号是什么号
  6. CAS详解及ABA问题的解决
  7. Mac上有哪些冷门但却逆天的软件?
  8. 爬去微信小程序服务器代码,Python爬取微信小程序通用方法代码实例详解
  9. 谷歌人工智能责任:技术、人工智能、社会和文化 | Responsible AI at Google Research: Technology, AI, Society and Culture
  10. Linux中ifconfig命令失效