Python的线程池实现】的更多相关文章

# -*- coding: utf-8 -*- #Python的线程池实现 import Queue import threading import sys import time import urllib #替我们工作的线程池中的线程 class MyThread(threading.Thread): def __init__(self, workQueue, resultQueue,timeout=30, **kwargs): threading.Thread.__init__(self,…
线程池概念 什么是线程池?诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务.但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大.所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这样就引入了“池”的概念,“池”的概念使得人们可以定制一定量的资源,然后对这些资源…
版本一: #!/usr/bin/env python # -*- coding:utf-8 -*- import Queue import threading class ThreadPool(object): def __init__(self, max_num=20): self.queue = Queue.Queue(max_num) for i in xrange(max_num): self.queue.put(threading.Thread) def get_thread(self…
关于python的多线程,由与GIL的存在被广大群主所诟病,说python的多线程不是真正的多线程.但多线程处理IO密集的任务效率还是可以杠杠的. 我实现的这个线程池其实是根据银角的思路来实现的. 主要思路: 任务获取和执行: 1.任务加入队列,等待线程来获取并执行. 2.按需生成线程,每个线程循环取任务. 线程销毁: 1.获取任务是终止符时,线程停止. 2.线程池close()时,向任务队列加入和已生成线程等量的终止符. 3.线程池terminate()时,设置线程下次任务取到为终止符. 流程…
#!/usr/bin/env python # -*- coding: utf-8 -*- """ concurrent 用于线程池和进程池编程而且更加容易,在Python3.2中才有. """ import sys from concurrent.futures import ThreadPoolExecutor, as_completed, wait from multiprocessing import Manager Manager().…
初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程,而同时只允许3个线程在运行,但是20个线程都需要创建和销毁,线程的创建是需要消耗系统资源的,有没有更好的方案呢?其实只需要三个线程就行了,每个线程各分配一个任务,剩下的任务排队等待,当某个线程完成了任务的时候,排队任务就可以安排给这个线程继续执行. 这就是线程池的思想(当然没这么简单),但是自己编…
一.线程池(concurrent.futures模块) #1 介绍 concurrent.futures模块提供了高度封装的异步调用接口 ThreadPoolExecutor:线程池,提供异步调用 ProcessPoolExecutor: 进程池,提供异步调用 Both implement the same interface, which is defined by the abstract Executor class. #2 基本方法 #submit(fn, *args, **kwargs…
初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程,而同时只允许3个线程在运行,但是20个线程都需要创建和销毁,线程的创建是需要消耗系统资源的,有没有更好的方案呢?其实只需要三个线程就行了,每个线程各分配一个任务,剩下的任务排队等待,当某个线程完成了任务的时候,排队任务就可以安排给这个线程继续执行. 这就是线程池的思想(当然没这么简单),但是自己编…
线程池 简单线程池 import queue import threading import time class ThreadPool(object): #创建线程池类 def __init__(self, max_num=20): #创建一个最大长度为20的队列 self.queue = queue.Queue(max_num) #创建一个队列 for i in range(max_num): #循环把线程对象加入到队列中 self.queue.put(threading.Thread) #…
2.绝版线程池设计思路:运用队列queue a.队列里面放任务 b.线程一次次去取任务,线程一空闲就去取任务 import queueimport threadingimport contextlibimport time StopEvent = object() class ThreadPool(object): def __init__(self, max_num, max_task_num = None): if max_task_num: self.q = queue.Queue(max…
"""思路1,将任务放在队列 1)创建队列:(初始化) 2)设置大小,线程池的最大容量 3)真实创建的线程 列表 4)空闲的线程数量 2,着手开始处理任务 1)创建线程 2)空闲线程数量大于0,则不再创建线程 3)创建线程池的数量 不能高于线程池的限制 4)根据任务个数判断 创建线程的数量 2)线程去队列中取任务 1)取任务包(任务包是一个元祖) 2)任务为空时,不再取(终止)""" import timeimport threadingimpo…
# coding=utf-8 import threading import Queue import time import traceback class ThreadPoolExecutor(object): def __init__(self, max_works): self._q = Queue.Queue() self.max_works=max_works self.started=0 def worker(self): while True: (fn, args) = self…
import sys import threading import Queue import traceback # 定义一些Exception,用于自定义异常处理 class NoResultsPending(Exception): """All works requests have been processed""" pass class NoWorkersAvailable(Exception): """N…
使用线程池实现高IO并发 模块:ThreadPoolExecutor, as_completed 测试代码如下: #!/opt/python3/bin/python3 from concurrent.futures import ThreadPoolExecutor, as_completed import time def test(arg1, arg2, arg3): time.sleep(int(arg1)) print('参数1:%s 参数2:%s 参数3:%s' % (arg1,arg…
线程池 什么是线程池? 诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务. 构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务. 但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大. 所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这样就引入了"池"的概念, "池"的概念使得人们…
线程池和进程池 一.池的概念 池是用来保证计算机硬件安全的情况下最大限度的利用计算机 它降低了程序的运行效率但是保证了计算机硬件的安全从而让你写的程序能够正常运行 ''' 无论是开设进程也好还是开设线程也好 是不是都需要消耗资源 只不过开设线程的消耗比开设进程的稍微小一点而已 我们是不可能做到无限制的开设进程和线程的 因为计算机硬件的资源更不上!!! 硬件的开发速度远远赶不上软件 我们的宗旨应该是在保证计算机硬件能够正常工作的情况下最大限度的利用它 ''' 二.线程池 基本使用方式: from…
背景 在有200W的任务需要取抓取的时候,目前采用的是线程池去抓取,最终导致内存暴涨. 原因 Threadpoolexcutor默认使用的是无界队列,如果消费任务的速度低于生产任务,那么会把生产任务无限添加到无界队列中.导致内存被占满 解决方案 修改无界队列为有界队列 import queue from concurrent.futures import ThreadPoolExecutor class ThreadPoolExecutor(ThreadPoolExecutor): ""…
一.DBUtils DBUtils 是一套允许线程化 Python 程序可以安全和有效的访问数据库的模块,DBUtils提供两种外部接口: PersistentDB :提供线程专用的数据库连接,并自动管理连接. PooledDB :提供线程间可共享的数据库连接,并自动管理连接. 操作数据库模板: import datetime import sys import os import configparser import logging import psycopg2 from DBUtils.…
python 的线程池主要有threadpool,不过它并不是内置的库,每次使用都需要安装,而且使用起来也不是那么好用,所以自己写了一个线程池实现,每次需要使用直接import即可.其中还可以根据传入的特征量handlerkey来获取每个任务的结果. #!/bin/env python # -*- coding:utf-8 -*- """ @lx created on 2016-04-14 """ import Queue import sys…
这周的作业是写一个线程池,python的线程一直被称为鸡肋,所以它也没有亲生的线程池,但是竟然被我发现了野生的线程池,简直不能更幸运~~~于是,我开始啃源码,实在是虐心,在啃源码的过程中,我简略的了解了python线程的相关知识,感觉还是很有趣的,于是写博客困难症患者一夜之间化身写作小能手,完成了一系列线程相关的博客,然后恍然发现,python的多线程是一个鸡肋哎...这里换来了同事们的白眼若干→_→.嘻嘻,但是鸡肋归鸡肋,看懂了一篇源码给我带来的收获和成就感还是不能小视,所以还是分享下~~~…
线程池的概念是什么? 在IBM文档库中这样的一段描写:“在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源.在Java中更是 如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收.所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些 很耗资源的对象创建和销毁.如何利用已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因.”--IBM文档库. 根据IBM文档中的描述,我理解为线程…
初学python,实现了一个简单的线程池框架,线程池中除Wokers(工作线程)外,还单独创建了一个日志线程,用于日志的输出.线程间采用Queue方式进行通信. 代码如下:(不足之处,还请高手指正) #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ = "pandaychen" import Queue import sys import os import threading import time import sign…
python为了方便人们编程高度封装了很多东西,比如进程里的进程池,大大方便了人们编程的效率,但是默认却没有线程池,本人前段时间整理出一个线程池,并进行了简单的解析和注释,本人水平有限,如有错误希望高手指点,愿与君共同学习与进步,废话少说,上源码 import threading,time,queue stop = object() class Thread(object): def __init__(self,max_num):#构造函数 self.q = queue.Queue() #创建一…
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time    def show(arg):     time.sleep(1)     print 'thread'+str(arg)    for i in range(10):     t = threading.Thread(target=show, args…
低版本: #!/usr/bin/env python import threading import time import queue class TreadPool: """ 将线程加入到队列中作为资源去完成任务 优点:简单好写容易理解 缺点:太尼玛多了..... """ def __init__(self, maxsize): self.maxsize = maxsize self._q = queue.Queue(maxsize) for…
特别感谢simomo 什么是线程池? 诸如web服务器.数据库服务器.文件服务器和邮件服务器等许多服务器应用都面向处理来自某些远程来源的大量短小的任务.构建服务器应用程序的一个过于简单的模型是:每当一个请求到达就创建一个新的服务对象,然后在新的服务对象中为请求服务.但当有大量请求并发访问时,服务器不断的创建和销毁对象的开销很大.所以提高服务器效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这样就引入了"池"的概念,"池"的概念使…
先上代码: pool = threadpool.ThreadPool(10) #建立线程池,控制线程数量为10 reqs = threadpool.makeRequests(get_title, data, print_result) #构建请求,get_title为要运行的函数,data为要多线程执行函数的参数 #最后这个print_result是可选的,是对前两个函数运行结果的操作 [pool.putRequest(req) for req in reqs] #多线程一块执行 pool.wa…
Python 的 简单多线程实现 用 dummy 模块 一句话就可以搞定,但需要对线程,队列做进一步的操作,最好自己写个线程池类来实现. Code: # coding:utf-8 # version: 0.1 import re,time from requests import get from Queue import Queue, Empty from threading import Thread # 全局变量 COUNT = 0 # 爬虫类 class Spider(Thread):…
最近由于项目需要一个与linux shell交互的多线程程序,需要用python实现,之前从没接触过python,这次匆匆忙忙的使用python,发现python确实语法非常简单,功能非常强大,因为自己是从零开始使用python,连语法都是现学的,所以将一些使用记录下来,希望能帮到大家. 使用python的需求简单的说是调用liunux下的ffmpeg获取音频的一些信息,需要用多线程实现 一.subprocess 因为是多线程,首先想到的是subprocess模块(官方文档说明此模块将会代替os…
进程池 import multiprocessing import time def do_calculation(data): print(multiprocessing.current_process().name + " " + str(data)) time.sleep(3) return data * 2 def start_process(): print ('Starting', multiprocessing.current_process().name) if __n…