版本一

#!/usr/bin/env  python
# --*--coding:utf-8 --*--
import Queue
import threading

class ThreadPool(object):
#创建类
    def __init__(self, max_num=20):#进程函数,默认最大20个进程
        self.queue = Queue.Queue(max_num)#生成进程
        for i in xrange(max_num):#循环进程
            self.queue.put(threading.Thread)#上传进程

def get_thread(self):#下载进程函数
        return self.queue.get()

def add_thread(self):#生成进程函数
        self.queue.put(threading.Thread)

pool = ThreadPool(10)#执行类,并传默认进程数值

def func(arg, p):#打印进程
    print arg
    import time
    time.sleep(2)#间隔2秒
    p.add_thread()

for i in xrange(30):#循环进程
    thread = pool.get_thread()
    t = thread(target=func, args=(i, pool))#传值到func函数,并且执行
    t.start()

版本二

from Queue import Queue
import contextlib
import threading
 
WorkerStop = object()
 
 
class ThreadPool:
 
    workers = 0
 
    threadFactory = threading.Thread
    currentThread = staticmethod(threading.currentThread)
 
    def __init__(self, maxthreads=20, name=None):
 
        self.q = Queue(0)
        self.max = maxthreads
        self.name = name
        self.waiters = []
        self.working = []
 
    def start(self):
        while self.workers < min(self.max, self.q.qsize()+len(self.working)):
            self.startAWorker()
 
    def startAWorker(self):
        self.workers += 1
        name = "PoolThread-%s-%s" % (self.name or id(self), self.workers)
        newThread = self.threadFactory(target=self._worker, name=name)
        newThread.start()
 
    def callInThread(self, func, *args, **kw):
        self.callInThreadWithCallback(None, func, *args, **kw)
 
    def callInThreadWithCallback(self, onResult, func, *args, **kw):
        o = (func, args, kw, onResult)
        self.q.put(o)
 
 
    @contextlib.contextmanager
    def _workerState(self, stateList, workerThread):
        stateList.append(workerThread)
        try:
            yield
        finally:
            stateList.remove(workerThread)
 
    def _worker(self):
        ct = self.currentThread()
        o = self.q.get()
        while o is not WorkerStop:
            with self._workerState(self.working, ct):
                function, args, kwargs, onResult = o
                del o
                try:
                    result = function(*args, **kwargs)
                    success = True
                except:
                    success = False
                    if onResult is None:
                        pass
 
                    else:
                        pass
 
                del function, args, kwargs
 
                if onResult is not None:
                    try:
                        onResult(success, result)
                    except:
                        #context.call(ctx, log.err)
                        pass
 
                del onResult, result
 
            with self._workerState(self.waiters, ct):
                o = self.q.get()
 
    def stop(self):
        while self.workers:
            self.q.put(WorkerStop)
            self.workers -= 1
 
 
"""
def show(arg):
    import time
    time.sleep(1)
    print arg
 
 
pool = ThreadPool(20)
 
for i in range(500):
    pool.callInThread(show, i)
 
pool.start()
pool.stop()
"""

转载于:https://www.cnblogs.com/wulaoer/p/5122472.html

Python之路:线程池相关推荐

  1. python停止线程池_详解python中Threadpool线程池任务终止示例代码

    需求 加入我们需要处理一串个位数(0~9),奇数时需要循环打印它:偶数则等待对应时长并完成所有任务:0则是错误,但不需要终止任务,可以自定义一些处理. 关键点 定义func函数处理需求 callbac ...

  2. python ping利用线程池获取在线设备

    python ping获取一个VLAN在线设备 myPyPingDevice.py """=== coding: UTF8 ===""" # ...

  3. 用 Python 实现的线程池

    为了提高程序的效率,经常要用到多线程,尤其是IO等需要等待外部响应的部分.线程的创建.销毁和调度本身是有代价的,如果一个线程的任务相对简单,那这些时间和空间开销就不容忽视了,此时用线程池就是更好的选择 ...

  4. Python爬虫——使用线程池爬取同程旅行景点数据并做数据可视化

    大家好!我是霖hero 正所谓:有朋自远方来,不亦乐乎?有朋友来找我们玩,是一件很快乐的事情,那么我们要尽地主之谊,好好带朋友去玩耍!那么问题来了,什么时候去哪里玩最好呢,哪里玩的地方最多呢? 今天将 ...

  5. Python学习:线程池原理及实现

    传统多线程方案会使用"即时创建, 即时销毁"的策略.尽管与创建进程相比,创建线程的时间已经大大的缩短,但是如果提交给线程的任务是执行时间较短,而且执行次数极其频繁,那么服务器将处于 ...

  6. 【Python】实现线程池

    一.线程池代码解释 1.初始化函数__init__(): 2.线程池启动函数run(): 3.创建线程函数generate_thread(): 4.处理任务函数call(): 5.关闭线程函数clos ...

  7. Python爬虫_线程池实例——北京新发地菜价

    import requests import json import jsonpath from concurrent.futures import ThreadPoolExecutor print( ...

  8. python爬虫利用线程池下载视频

    由于requests模块中,requests.get()是线程阻塞的,所有当有多个爬虫进行爬取时,那么单线程式爬虫是耗时比较长的,所以我们需要使用线程池,利用线程池来爬取耗时比较长的资源,这里我们使用 ...

  9. python之路--线程和进程

    线程 python中有关线程的有两个模块比较常用 分别是thread和threading. 首先说为什么要用线程呢.正如那句话吃着火锅听着歌. 像之前写的python程序,程序执行,每时刻只有一个任务 ...

  10. 自定义简单版本python线程池

    python未提供线程池模块,在python3上用threading和queue模块自定义简单线程池,代码如下: 1 #用threading queue 做线程池 2 import queue 3 i ...

最新文章

  1. python解释器运行代码-python解释器怎么运行
  2. 《互联网运营智慧》终于上市销售了
  3. linux:安装ubuntu18-04
  4. c#中BackGroundWorker控件
  5. Redis悲观锁、乐观锁和调用Lua脚本的优缺点
  6. 马化腾“闪退”华人首富;马云回应收购中天微;华为遭美刑事调查 | CSDN极客头条...
  7. Python的Boolean操作
  8. SecureCrt 常用命令
  9. CS0016错误解决汇编
  10. MyBatis源码阅读(八) --- Executor执行器
  11. excel多个工作表合并在一个表
  12. 【12c】直方图Histograms
  13. 费马定理_高数_1元微积分
  14. Java和部门管理的那些事情
  15. js-视频播放插件Video.js简单使用
  16. 发票查验平台验证码识别
  17. 浅谈-什么是计算机视觉
  18. wifi6 增加穿墙能力详解
  19. ddm模型公式_用DDM模型来判断市场理论上的合理市盈率
  20. SQL数据库系统设计之食堂管理系统

热门文章

  1. Mysql JDBC 连接串参数说明
  2. Android——用Activity和Service实现简单的音乐播放器
  3. UVa OJ 120
  4. 微软企业库5.0 学习之路——UnityPIAB 通过配置实现AOP
  5. vue-electron 写一个markdown文章编辑器(一)
  6. Javascript 创建对象方法的总结
  7. Open XML应用安全(2)OLE机制
  8. There is no public key available for the following key IDs
  9. c# GDI+简单绘图(一)
  10. 【知识小课堂】 mongodb 之字段中的【 数组】、【内嵌文档】